Skip to content

Commit e52d521

Browse files
MohammadHadi2031Keboo
authored andcommitted
automatically add toggle button to first column
1 parent 2ebfed0 commit e52d521

File tree

3 files changed

+92
-30
lines changed

3 files changed

+92
-30
lines changed

src/MainDemo.Wpf/Trees.xaml

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
77
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
88
xmlns:smtx="clr-namespace:ShowMeTheXAML;assembly=ShowMeTheXAML"
9-
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters;assembly=MaterialDesignThemes.Wpf"
109
d:DataContext="{d:DesignInstance domain:TreesViewModel}"
1110
d:DesignHeight="1080"
1211
d:DesignWidth="1920"
@@ -19,8 +18,6 @@
1918
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.PopupBox.xaml" />
2019
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBlock.xaml" />
2120
</ResourceDictionary.MergedDictionaries>
22-
23-
<converters:TreeListViewIndentConverter x:Key="TreeListViewIndentConverter" />
2421
</ResourceDictionary>
2522
</UserControl.Resources>
2623

@@ -218,18 +215,7 @@
218215
SelectedItem="{Binding SelectedTreeItem}">
219216
<materialDesign:TreeListView.Resources>
220217
<HierarchicalDataTemplate DataType="{x:Type domain:TestItem}" ItemsSource="{Binding Items, Mode=OneTime}">
221-
<StackPanel Orientation="Horizontal">
222-
<StackPanel.Margin>
223-
<MultiBinding Converter="{StaticResource TreeListViewIndentConverter}">
224-
<Binding Path="LevelIndentSize" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type materialDesign:TreeListView}}" />
225-
<Binding Path="Level" RelativeSource="{RelativeSource AncestorType={x:Type materialDesign:TreeListViewItem}}" />
226-
</MultiBinding>
227-
</StackPanel.Margin>
228-
229-
<ToggleButton IsChecked="{Binding RelativeSource={RelativeSource AncestorType=materialDesign:TreeListViewItem, Mode=FindAncestor}, Path=IsExpanded}" Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
230-
231218
<TextBlock VerticalAlignment="Center" Text="{Binding Name, Mode=OneTime}" />
232-
</StackPanel>
233219
</HierarchicalDataTemplate>
234220

235221
<HierarchicalDataTemplate DataType="{x:Type domain:MovieCategory}"
@@ -258,24 +244,13 @@
258244
</Style>
259245
</materialDesign:TreeListView.ItemContainerStyle>
260246

261-
<materialDesign:TreeListView.View>
247+
<!--<materialDesign:TreeListView.View>
262248
<GridView>
263249
<GridView.Columns>
264250
<GridViewColumn Width="250" Header="Name">
265251
<GridViewColumn.CellTemplate>
266252
<DataTemplate>
267-
<StackPanel Orientation="Horizontal">
268-
<StackPanel.Margin>
269-
<MultiBinding Converter="{StaticResource TreeListViewIndentConverter}">
270-
<Binding Path="LevelIndentSize" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type materialDesign:TreeListView}}" />
271-
<Binding Path="Level" RelativeSource="{RelativeSource AncestorType={x:Type materialDesign:TreeListViewItem}}" />
272-
</MultiBinding>
273-
</StackPanel.Margin>
274-
275-
<ToggleButton IsChecked="{Binding RelativeSource={RelativeSource AncestorType=materialDesign:TreeListViewItem, Mode=FindAncestor}, Path=IsExpanded}" Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
276-
277-
<TextBlock VerticalAlignment="Center" Text="{Binding Name, Mode=OneTime}" />
278-
</StackPanel>
253+
<TextBlock VerticalAlignment="Center" Text="{Binding Name, Mode=OneTime}" />
279254
</DataTemplate>
280255
</GridViewColumn.CellTemplate>
281256
</GridViewColumn>
@@ -289,7 +264,7 @@
289264
</GridViewColumn>
290265
</GridView.Columns>
291266
</GridView>
292-
</materialDesign:TreeListView.View>
267+
</materialDesign:TreeListView.View>-->
293268
</materialDesign:TreeListView>
294269
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right">
295270
<Button Command="{Binding AddListTreeItemCommand}"

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,16 @@
112112
<Setter Property="Template">
113113
<Setter.Value>
114114
<ControlTemplate TargetType="{x:Type wpf:TreeListViewItem}">
115-
<Grid>
115+
<Grid x:Name="ItemGrid">
116+
<Grid.Margin>
117+
<MultiBinding Converter="{x:Static converters:TreeListViewIndentConverter.Instance}">
118+
<Binding Path="LevelIndentSize"
119+
RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type wpf:TreeListView}}"
120+
FallbackValue="16" />
121+
<Binding Path="Level"
122+
RelativeSource="{RelativeSource TemplatedParent}" />
123+
</MultiBinding>
124+
</Grid.Margin>
116125
<Grid.ColumnDefinitions>
117126
<ColumnDefinition Width="Auto" />
118127
<ColumnDefinition Width="Auto" />
@@ -166,7 +175,15 @@
166175
<VisualState x:Name="Collapsed" />
167176
</VisualStateGroup>
168177
</VisualStateManager.VisualStateGroups>
169-
178+
<ToggleButton x:Name="Expander"
179+
Width="{TemplateBinding wpf:TreeViewAssist.ExpanderSize}"
180+
Height="{TemplateBinding wpf:TreeViewAssist.ExpanderSize}"
181+
Margin="8,0,8,0"
182+
VerticalAlignment="Center"
183+
ClickMode="Press"
184+
Foreground="{TemplateBinding Foreground}"
185+
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
186+
Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
170187
<Border x:Name="MouseOverBorder"
171188
Grid.Column="1"
172189
Grid.ColumnSpan="2"
@@ -234,6 +251,8 @@
234251
<DataTrigger Binding="{Binding View, RelativeSource={RelativeSource AncestorType=wpf:TreeListView}, Converter={StaticResource ViewIsGridViewConverter}}" Value="True">
235252
<Setter TargetName="PART_ContentPresenter" Property="Visibility" Value="Hidden" />
236253
<Setter TargetName="PART_GridViewRowPresenterr" Property="Visibility" Value="Visible" />
254+
<Setter TargetName="Expander" Property="Visibility" Value="Collapsed" />
255+
<Setter TargetName="ItemGrid" Property="Margin" Value="0" />
237256
</DataTrigger>
238257
</ControlTemplate.Triggers>
239258
</ControlTemplate>

src/MaterialDesignThemes.Wpf/TreeListView.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
using System.Collections;
12
using System.Collections.Specialized;
23
using System.Windows.Automation.Peers;
4+
using System.Windows.Data;
5+
36
using MaterialDesignThemes.Wpf.Automation.Peers;
7+
using MaterialDesignThemes.Wpf.Converters;
48
using MaterialDesignThemes.Wpf.Internal;
59

610
namespace MaterialDesignThemes.Wpf;
@@ -266,4 +270,68 @@ internal void MoveSelectionToParent(TreeListViewItem item)
266270
}
267271
}
268272
}
273+
274+
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
275+
{
276+
base.OnPropertyChanged(e);
277+
278+
if (e.Property == ViewProperty)
279+
{
280+
if (View is GridView gridView)
281+
{
282+
AddToggleButtonToFirstColumn(gridView);
283+
}
284+
}
285+
}
286+
287+
private void AddToggleButtonToFirstColumn(GridView gridView)
288+
{
289+
if (gridView.Columns.Count > 0)
290+
{
291+
var firstColumn = gridView.Columns[0];
292+
firstColumn.CellTemplate = CreateToggleButtonTemplate(firstColumn.CellTemplate);
293+
}
294+
}
295+
296+
private DataTemplate CreateToggleButtonTemplate(DataTemplate originalTemplate)
297+
{
298+
var template = new DataTemplate();
299+
300+
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
301+
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
302+
303+
var marginMultiBinding = new MultiBinding
304+
{
305+
Converter = TreeListViewIndentConverter.Instance,
306+
};
307+
marginMultiBinding.Bindings.Add(new Binding("LevelIndentSize")
308+
{
309+
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(TreeListView), 1)
310+
});
311+
marginMultiBinding.Bindings.Add(new Binding("Level")
312+
{
313+
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(TreeListViewItem), 1)
314+
});
315+
stackPanelFactory.SetBinding(StackPanel.MarginProperty, marginMultiBinding);
316+
317+
var toggleButtonFactory = new FrameworkElementFactory(typeof(ToggleButton));
318+
toggleButtonFactory.SetValue(ToggleButton.StyleProperty, Application.Current.Resources["MaterialDesignTreeListViewToggleButtonStyle"]);
319+
320+
toggleButtonFactory.SetBinding(ToggleButton.IsCheckedProperty, new Binding("IsExpanded")
321+
{
322+
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(TreeListViewItem), 1)
323+
});
324+
325+
stackPanelFactory.AppendChild(toggleButtonFactory);
326+
327+
if (originalTemplate != null)
328+
{
329+
var originalContentFactory = new FrameworkElementFactory(typeof(ContentPresenter));
330+
originalContentFactory.SetValue(ContentPresenter.ContentTemplateProperty, originalTemplate);
331+
stackPanelFactory.AppendChild(originalContentFactory);
332+
}
333+
334+
template.VisualTree = stackPanelFactory;
335+
return template;
336+
}
269337
}

0 commit comments

Comments
 (0)