window template WPF
-
אבל במקרה זה הוא לא נותן להוסיף פקדים בחלון הנוכחי
מה הכוונה מקרה זה?
שים נגיד את הקוד דלהלן בApp.xaml:
<Style TargetType="{x:Type Window}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Window}"> <Border > <Grid > <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition Height="*"/> <RowDefinition Height="50"/> </Grid.RowDefinitions> <Border> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" >כותרת עליונה</TextBlock> </Border> <AdornerDecorator Grid.Row="1"> <ContentPresenter/> </AdornerDecorator> <Border Grid.Row="2" > <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" >כותרת תחתונה</TextBlock> </Border> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
פורסם במקור בפורום CODE613 ב18/03/2014 14:23 (+02:00)
-
אני חושב שאפשר לעשות מחלקה כזו:
Public Class windowFace Inherits UserControl Protected Overrides Sub OnInitialized(e As System.EventArgs) MyBase.OnInitialized(e) InitializeComponent() End Sub Private _mainGrid As Grid Public Property mainGrid() As Grid Get Return _mainGrid End Get Set(value As Grid) _mainGrid = value grid1.Children.Add(_mainGrid) Grid.SetRow(_mainGrid, 1) End Set End Property Dim grid1 As System.Windows.Controls.Grid = New System.Windows.Controls.Grid() Private Sub InitializeComponent() Dim rowDefinition2 As System.Windows.Controls.RowDefinition = New System.Windows.Controls.RowDefinition() Dim rowDefinition3 As System.Windows.Controls.RowDefinition = New System.Windows.Controls.RowDefinition() Dim rowDefinition4 As System.Windows.Controls.RowDefinition = New System.Windows.Controls.RowDefinition() Dim label5 As System.Windows.Controls.Label = New System.Windows.Controls.Label() Dim label6 As System.Windows.Controls.Label = New System.Windows.Controls.Label() Me.BeginInit() Me.FlowDirection = System.Windows.FlowDirection.RightToLeft grid1.BeginInit() rowDefinition2.BeginInit() rowDefinition2.Height = New System.Windows.GridLength(50.0R, System.Windows.GridUnitType.Pixel) rowDefinition2.EndInit() rowDefinition3.BeginInit() rowDefinition3.Height = New System.Windows.GridLength(1.0R, System.Windows.GridUnitType.Star) rowDefinition3.EndInit() rowDefinition4.BeginInit() rowDefinition4.Height = New System.Windows.GridLength(50.0R, System.Windows.GridUnitType.Pixel) rowDefinition4.EndInit() grid1.RowDefinitions.Add(rowDefinition2) grid1.RowDefinitions.Add(rowDefinition3) grid1.RowDefinitions.Add(rowDefinition4) label5.BeginInit() label5.Name = "Label1" label5.Content = "כותרת עליונה" label5.HorizontalAlignment = System.Windows.HorizontalAlignment.Center label5.VerticalAlignment = System.Windows.VerticalAlignment.Center label5.EndInit() label6.BeginInit() label6.Name = "Label2" label6.Content = "כותרת תחתונה" label6.HorizontalAlignment = System.Windows.HorizontalAlignment.Center label6.VerticalAlignment = System.Windows.VerticalAlignment.Center System.Windows.Controls.Grid.SetRow(label6, 2) label6.EndInit() grid1.Children.Add(label5) grid1.Children.Add(label6) grid1.EndInit() Me.Content = grid1 Me.EndInit() End Sub End Class
ותשתמש בזה כפקד בכל חלון כך:
<Window x:Class="Window3" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window3" Height="300" Width="300" xmlns:my="clr-namespace:WindowTemplet"> <Grid> <my:windowFace HorizontalAlignment="Stretch" x:Name="WindowFace1" VerticalAlignment="Stretch" > <my:windowFace.mainGrid> <Grid > <Button Margin="38,40,55,38" Name="Button">Button</Button> </Grid> </my:windowFace.mainGrid> </my:windowFace> </Grid> </Window>
בתוך ה mainGrid אתה יכול לשים כל מה שצריך להיות בחלון הזה.
פורסם במקור בפורום CODE613 ב18/03/2014 15:07 (+02:00)
-
אני לא יודע באמת למה במן ריצה זה לא עובד ככה, בכל אופן אם מפרשים לסטייל KEY ונותנים לו התייחסות של סטטיק ריסורס בכל חלון (במאפיין סטייל) אז זה עובד.
שמואל, אם אתה רוצה לשנות בכל חלון את הפקדים שבכותרת עליונה ותחתונה, אז למה טמפלט? תעתיק ותדביק מפעם אחת ממנה אתה מרוצה.
אם אתה רוצה שרק הטקסט וכדו' ישתנה אז תוכל לעשות בטמפלט בינדינג לאלמנטים אחרים של החלון כמו לטייטל ועוד.פורסם במקור בפורום CODE613 ב18/03/2014 15:41 (+02:00)
-
בקיצור אתה אומר לכתוב קוד לא בXAML
בלית ברירה אולי זה הפיתרון
פשוט קשה לי האמין שאין לזה דרך בxamlאפשר גם אם XAML בצורה הבאה:
מוסיפים לפרוייקט פקד חדש, זה ה XAML שלו:
<UserControl x:Class="UserControl2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid > <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition Height="*"/> <RowDefinition Height="50"/> </Grid.RowDefinitions> <Border> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" >כותרת עליונה</TextBlock> </Border> <Grid Grid.Row="1" Name="Grid1"> </Grid> <Border Grid.Row="2" > <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" >כותרת תחתונה</TextBlock> </Border> </Grid> </UserControl>
וזה הקוד:
Public Class UserControl1 Inherits UserControl Dim UC As New UserControl2 Public Sub New() Me.Content = UC End Sub Private _mainGrid As Grid Public Property mainGrid() As Grid Get Return _mainGrid End Get Set(value As Grid) _mainGrid = value UC.Grid1.Children.Add(_mainGrid) Grid.SetRow(_mainGrid, 1) End Set End Property End Class
ואז אפשר להוסיף את זה לכל חלון כך:
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:test"> <my:UserControl1 x:Name="UserControl11" > <my:UserControl1.mainGrid> <Grid Name="Grid"> <Button Margin="39,40,61,51" Name="Button">לחצן</Button> </Grid> </my:UserControl1.mainGrid> </my:UserControl1> </Window>
כמו מקודם בתוך ה mainGrid אתה יוכל להכניס מה שתרצה.
[שימו לב! יש פה טריק שבעזרתו אפשר לעשות UserControl עם XAML וגם להכניס לתוכו פקדים עם שמות - בעיה שהועלת כאן בפורום בעבר וגם בכמה מקומות ברשת ולא נמצא לה פתרון.]פורסם במקור בפורום CODE613 ב18/03/2014 19:00 (+02:00)
-
זה מה שעשיתי עם הטמפלט:
<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" Style="{StaticResource WindowTemplate}"> <Grid> </Grid> </Window>
והתוצאה בזמן ריצה ... חלון שחור !
פורסם במקור בפורום CODE613 ב18/03/2014 20:04 (+02:00)
-
והתוצאה בזמן ריצה ... חלון שחור !
יאהווו!! ולכן עבדת כ"כ קשה! אז קבל שתי אפשרויות: או קבע צבע רקע לאלמנט הראשי בטמפלט (בורדר או גריד), או אפשרות מרתקת יותר קבע את שני הערכים האלו: WindowStyle="None" AllowsTransparency="True" בסטייל או בחלון.
פורסם במקור בפורום CODE613 ב18/03/2014 20:24 (+02:00)
-
טוב אז פתרנו את הבעיה של הצבע.
אבל בכל מקרה לדעתי יש עדיפות לפקד מאשר לטמפלט במקרה שתרצה שלכל החלונות יהיה עיצוב שווה אבל מצד שני תוכל להוסיף לכל חלון אייקון משלו בכותרת העליונה למשל, וכן תוכל להוסיף איזה סרגל כלים לכותרת התחתונה לפי האופי של החלון הספציפי. וכן תוכל להגדיר כיתוב בכותרת העליונה/התחתונה בלא להיות תלוי בכותרת החלון עצמו.פורסם במקור בפורום CODE613 ב18/03/2014 21:22 (+02:00)
-
טוב אז פתרנו את הבעיה של הצבע.
אבל בכל מקרה לדעתי יש עדיפות לפקד מאשר לטמפלט במקרה שתרצה שלכל החלונות יהיה עיצוב שווה אבל מצד שני תוכל להוסיף לכל חלון אייקון משלו בכותרת העליונה למשל, וכן תוכל להוסיף איזה סרגל כלים לכותרת התחתונה לפי האופי של החלון הספציפי. וכן תוכל להגדיר כיתוב בכותרת העליונה/התחתונה בלא להיות תלוי בכותרת החלון עצמו.ייתכן.
אבל שים לב שבשביל זה לא צריך UserControl שמכיל את תוכן החלון, די בUserControl שנמצא בראש החלון.
בכל מקרה, לעולם לא צריך שילוב של שתי UserControls.פורסם במקור בפורום CODE613 ב18/03/2014 22:14 (+02:00)
-
אלו לא באמת 2 UserControl אלא רק 1 רק בהצהרה הם שניים כדי שאחד יכיל את הXAML והשני את הקוד וכך יהיה אפשר מצד אחד לעצב את ה UserControl ב XAML ומצד שני להוסיף פקדים לתוך ה UserControl ולתת להם שם בלא לקבל שגיאה.
פורסם במקור בפורום CODE613 ב18/03/2014 22:27 (+02:00)
-
@דוד ל.ט.
אני לא יודע באמת למה במן ריצה זה לא עובד ככה, בכל אופן אם מפרשים לסטייל KEY ונותנים לו התייחסות של סטטיק ריסורס בכל חלון (במאפיין סטייל) אז זה עובד.
תכל'ס אצלי עובד רק בזמן עיצוב ולא בזמן ריצה
@דוד ל.ט.
שמואל, אם אתה רוצה לשנות בכל חלון את הפקדים שבכותרת עליונה ותחתונה, אז למה טמפלט? תעתיק ותדביק מפעם אחת ממנה אתה מרוצה.
אם אתה רוצה שרק הטקסט וכדו' ישתנה אז תוכל לעשות בטמפלט בינדינג לאלמנטים אחרים של החלון כמו לטייטל ועוד.בלית ברירה אעשה כך אבל זה לא הדרך למסמכי xaml ארוכים ומייגעים
תאר לך גם 10 חלונות ויותר וכל שינוי תרוץ לעדכן בכולםפורסם במקור בפורום CODE613 ב18/03/2014 23:06 (+02:00)
-
@דוד ל.ט.
אני לא יודע באמת למה במן ריצה זה לא עובד ככה, בכל אופן אם מפרשים לסטייל KEY ונותנים לו התייחסות של סטטיק ריסורס בכל חלון (במאפיין סטייל) אז זה עובד.תכל'ס אצלי עובד רק בזמן עיצוב ולא בזמן ריצה
אולי תקנה מחשב חדש ?
בטוח עשית מה שכתבתי? לפרש שם לסטייל, וגם בחלון להציב סטטיק ריסורס.@דוד ל.ט.
שמואל, אם אתה רוצה לשנות בכל חלון את הפקדים שבכותרת עליונה ותחתונה, אז למה טמפלט? תעתיק ותדביק מפעם אחת ממנה אתה מרוצה.אם אתה רוצה שרק הטקסט וכדו' ישתנה אז תוכל לעשות בטמפלט בינדינג לאלמנטים אחרים של החלון כמו לטייטל ועוד.
בלית ברירה אעשה כך אבל זה לא הדרך למסמכי xaml ארוכים ומייגעים
תאר לך גם 10 חלונות ויותר וכל שינוי תרוץ לעדכן בכולםאשמח להבין מה המצב האידאלי אליו אתה שואף.
במסמך וורד לדוגמה, אתה יכול לעשות כותר עוליונה ותחתונה, ושיני שלה משתקף בכל הדפים, וזה בדיוק מה שהטמפלט יעשה.
אם אתה רוצה מראה אינדבדואלי לכל חלון, אך במראה עקבי, העתקה והדבקה של הדרך לא נראית לי בכלל מטריחה.
בכל מקרה אם תראה דוגמה ספציפית אולי יש מה להכליל בסגנון ראשי כדי להפוך את הגדרות המראה לריכוזיים יותר.פורסם במקור בפורום CODE613 ב19/03/2014 11:10 (+02:00)
-
WpfApplication6.rarמצורף קוד בסיסי מישהוא יכול לתת את הדעת למה זה לא עובד לי?
תודה רבהפורסם במקור בפורום CODE613 ב19/03/2014 11:44 (+02:00)
-
קודם כל זה חידוש גדול בשבילי
<AdornerDecorator Grid.Row="1"> <ContentPresenter/> </AdornerDecorator>
דבר שני
@דוד ל.ט.והתוצאה בזמן ריצה ... חלון שחור !
יאהווו!! ולכן עבדת כ"כ קשה! אז קבל שתי אפשרויות: או קבע צבע רקע לאלמנט הראשי בטמפלט (בורדר או גריד), או אפשרות מרתקת יותר קבע את שני הערכים האלו: WindowStyle="None" AllowsTransparency="True" בסטייל או בחלון.
כעת גם לי יוצא שחור מרכז החלון היכן שמיקום העריכה לא הבנתי מה אתה מרוויח במאפיינים אלו שכתבת אמנם הם מורידים את השחור אבל יש להם חסרון (להתחיל לבנות את כל האלמנטים של החלון)
פורסם במקור בפורום CODE613 ב19/03/2014 13:01 (+02:00)
-
לא הבנת כנראה לא כוונתי, התכוונתי לשנות את הטמפלט שהעליתי.
הנה ככה למשל:<Style x:Key="WinStyle" TargetType="{x:Type Window}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Window}"> <Grid Background="White"> <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition Height="*"/> <RowDefinition Height="50"/> </Grid.RowDefinitions> <Border > <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Title}" /> </Border> <AdornerDecorator Grid.Row="1"> <ContentPresenter/> </AdornerDecorator> <Border Grid.Row="2" > <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" >כותרת תחתונה</TextBlock> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
אגב הAdornerDecorator אני גם לא כ"כ מכיר, אני סה"כ העתקתי מהטמפלט שהVS יוצר.
פורסם במקור בפורום CODE613 ב19/03/2014 13:32 (+02:00)