window template WPF
-
אני מנסה ליצור טמפלט שכל חלון באפליקציה יהיה עם גריד וכו' ואני לא מצליח היכן אני שוגה?
להלן הקוד
<Window.Resources>
<Style TargetType="Window">
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="5*"/>
</Grid.RowDefinitions>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>תודה!
פורסם במקור בפורום CODE613 ב09/03/2014 18:26 (+02:00)
-
אתה לא שוגה, זה עובד היטב.
ולמה לא רואים את הפקדים? כי לא הגדרת להראות אותם בשום מקום. בשביל להראות תוכן של פקד יש פקד ששמו ContentPresenter והתפקיד שלו זה לרנדר תוכן במקום שיש לו.
אבל הכי פשוט לערוך את הטמפלט המקורי כך יודעים על מה לוותר ועל מה לא.
איך עורכים את המקורי? יש חלון Document Outline, ובVS2013 בקליק ימני הוא נותן אופציה של Edit Template > Edit a Copy... בתיבה הנפתחת בוחרים איפה הוא יצור וכו'. הוא יוצר סטייל שבתוכו הטמפלט ואפשר לוותר על הסטייל בהתאם לתבנית שרוצים, וגם למחוק כל הגדרה לא רלוונטית או רוצוייה.פורסם במקור בפורום CODE613 ב09/03/2014 18:54 (+02:00)
-
אבל במקרה זה הוא לא נותן להוסיף פקדים בחלון הנוכחי
מה הכוונה מקרה זה?
שים נגיד את הקוד דלהלן ב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)