WPF קינון פקדים בראש שורה בדטה-גריד
-
עשיתי קוד כזה:
<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"> <Grid> <DataGrid AutoGenerateColumns="True" Margin="10,10,12,12" Name="DataGrid1" ItemsSource="{Binding}" CanUserAddRows="True" CanUserDeleteRows="True" RowHeight="55"> <DataGrid.RowHeaderTemplate> <DataTemplate> <Button Content="+" VerticalAlignment="Top" VerticalContentAlignment="Top"> </Button> </DataTemplate> </DataGrid.RowHeaderTemplate> </DataGrid> </Grid> </Window> Imports System.Collections.ObjectModel Class MainWindow Dim coll As New ObservableCollection(Of Person) Public Sub New() ' This call is required by the designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. DataContext = coll For I = 0 To 10 coll.Add(New Person With {.Name = I, .LastName = I * I}) Next End Sub End Class Public Class Person Private _Name As String Public Property Name() As String Get Return _Name End Get Set(value As String) _Name = value End Set End Property Private _LastName As String Public Property LastName() As String Get Return _LastName End Get Set(value As String) _LastName = value End Set End Property End Class
מה שמפריע לי זה שלחצן ששמתי בראש השורה בדטה-גריד הוא תמיד באמצע גובה השורה ולא צמוד ללמעלה,
איך אני יכול להצמיד את הלחצן למעלה שלא יזוז כלל גם כאשר המשתמש ישנה את גובה השורה?תודה לכולם.
פורסם במקור בפורום CODE613 ב25/12/2013 15:39 (+02:00)
-
אני חושב שיש לי פתרון:
- אפשר להגדיר שהלחצן שבראש השורה יהיה בתוך גריד צמוד לחלק העליון של הגריד, אם גובה הגריד יהיה כגובה השורה הרי שהלחצן יהיה תמיד באותו מקום ולא ירד לאמצע.
- כדי לשנות את גובה הגריד כאשר גובה השורה משתנה יש ארוע שינוי גובה שורה שאפשר ליצור כמתואר כאן.
איך עושים את זה בדרך הנכונה?
למשל הקוד הבא לא עובד, רק בחלק אחד, כלומר הגריד אכן מקבל את גובה השורה אבל כאשר הגובה משתנה הבינדינג משום מה לא מעדכן את גובה הגריד בחזרה.<DataGrid.RowHeaderTemplate> <DataTemplate> <Grid Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow, AncestorLevel=1}, Path=ActualHeight}" Background="#FFD31C1C"> <Button Content="+" VerticalAlignment="Top" > </Button> </Grid> </DataTemplate> </DataGrid.RowHeaderTemplate>
פורסם במקור בפורום CODE613 ב31/12/2013 13:20 (+02:00)
-
הקישור שהבאת היה מצויין.
הנה דרך קלה ליצור טמפלט כמו שהובאה שם:
כתוב בתוך הXAML שלך במקום פנוי את השורה הזאת:<DataGridRowHeader />
בחלונית Document Outline תקליק בימיני על האלמנט הזה DataGridRowHeader,
לחץ על Edit Template ואז Edit a Copy.
בתיבת הדו שיח בחר בDefinen In בApplication.
אחרי היצירה מחק מהשורה הראשונה את הx:Key עם הערך.
לאחמ"כ אתר את השורה הזאת:<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
בסוף השורה החלף אתCenter לTop.
כעת תוכל למחוק את האלמנט DataGridRowHeader הריק שיצרת.
פורסם במקור בפורום CODE613 ב31/12/2013 15:49 (+02:00)
-
זה לא סותר תשתמש בשתיהם...
הנה הXAML:
<Style xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" TargetType="{x:Type DataGridRowHeader}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridRowHeader}"> <Grid> <Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" IsSelected="{TemplateBinding IsRowSelected}" Orientation="Horizontal" Padding="{TemplateBinding Padding}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}"> <StackPanel Orientation="Horizontal"> <ContentPresenter RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Top"/> <Control SnapsToDevicePixels="false" Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Visibility="{Binding (Validation.HasError), Converter={StaticResource bool2VisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"/> </StackPanel> </Themes:DataGridHeaderBorder> <Thumb x:Name="PART_TopHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Top"/> <Thumb x:Name="PART_BottomHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Bottom"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
תדביק את זה בApplication.xaml כך זה יחול על הכל בכל.
פורסם במקור בפורום CODE613 ב02/01/2014 16:48 (+02:00)
-
@דוד ל.ט.
Application.xaml
מדובר בפרוייקט DLL ואין שם את זה, יש איזו חלופה?
בנתיים שמתי בתוך הUSER FORM ואלו השגיאות שקיבלתי:
The resource "bool2VisibilityConverter" could not be resolved.
The resource "RowHeaderGripperStyle" could not be resolved.פורסם במקור בפורום CODE613 ב02/01/2014 17:58 (+02:00)
-
רפרנס ל PresentationFramework.Aero וניימספייס כבר הוספתי בתחילה ולכן לא היו אלא רק שני שגיאות שציינתי.
פורסם במקור בפורום CODE613 ב02/01/2014 19:44 (+02:00)
-
מקווה שכעת טוב.
<Style TargetType="{x:Type DataGridRowHeader}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridRowHeader}"> <Grid> <Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" IsSelected="{TemplateBinding IsRowSelected}" Orientation="Horizontal" Padding="{TemplateBinding Padding}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}"> <StackPanel Orientation="Horizontal"> <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Top"/> <Control SnapsToDevicePixels="False" Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGridRow}}}"> <Control.Visibility> <Binding Path="(Validation.HasError)" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGridRow}}"> <Binding.Converter> <BooleanToVisibilityConverter/> </Binding.Converter> </Binding> </Control.Visibility> </Control> </StackPanel> </Themes:DataGridHeaderBorder> <Thumb x:Name="PART_TopHeaderGripper" VerticalAlignment="Top"> <Thumb.Style> <Style TargetType="{x:Type Thumb}"> <Setter Property="Height" Value="8"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Cursor" Value="SizeNS"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </Thumb.Style> </Thumb> <Thumb x:Name="PART_BottomHeaderGripper" VerticalAlignment="Bottom"> <Thumb.Style> <Style TargetType="{x:Type Thumb}"> <Setter Property="Height" Value="8"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Cursor" Value="SizeNS"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </Thumb.Style> </Thumb> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
פורסם במקור בפורום CODE613 ב05/01/2014 13:23 (+02:00)