Skip to content

Commit a17bf56

Browse files
automatically add toggle button to first column
1 parent f18c1ec commit a17bf56

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

0 commit comments

Comments
 (0)