我有GridView一個ColumnHeaderTemplate
該模板包含一個名為 的路徑arrow:
<DataTemplate x:Key="HeaderTemplate">
<DockPanel>
<Path DockPanel.Dock="Right" Margin="5,0,5,0" x:Name="arrow" StrokeThickness="1" Fill="Gray" Data="M 5,5 L 10,10 L 15,5 L 5,5" SnapsToDevicePixels="True"/>
</DockPanel>
</DataTemplate>
模板在視圖中分配如下:
<GridView ColumnHeaderTemplate="{StaticResource HeaderTemplate}">
在管理事件的GridView內部ListView
GridViewColumnHeader.Click="ListView_ColumnHeaderClick"
private void ListView_ColumnHeaderClick(object sender, RoutedEventArgs e)
當事件被觸發時,我希望能夠找到arrow控制元件。
根據我的研究,我應該使用該Template.FindName方法,但到目前為止我還無法完成這項作業。我似乎找不到與該功能一起使用的正確物件,因此我從未找到我正在尋找的控制元件。
uj5u.com熱心網友回復:
不,FindName您的意思是適用于ControlTemplate,而不適用于DataTemplate。
- 如何:查找 ControlTemplate 生成的元素
因為DataTemplate您必須使用VisualTreeHelper.
- 如何:查找 DataTemplate 生成的元素
我不知道您是如何附加列標題事件處理程式的,所以我假設:
<ListView ItemsSource="{Binding YourItemsSource}">
<ListView.Resources>
<DataTemplate x:Key="HeaderTemplate">
<DockPanel>
<Path DockPanel.Dock="Right" Margin="5,0,5,0" x:Name="arrow" StrokeThickness="1" Fill="Gray" Data="M 5,5 L 10,10 L 15,5 L 5,5" SnapsToDevicePixels="True"/>
</DockPanel>
</DataTemplate>
<Style x:Key="HeaderContainerStyle" TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource {x:Type GridViewColumnHeader}}">
<EventSetter Event="Click" Handler="ListView_ColumnHeaderClick"/>
</Style>
</ListView.Resources>
<ListView.View>
<GridView ColumnHeaderTemplate="{StaticResource HeaderTemplate}"
ColumnHeaderContainerStyle="{StaticResource HeaderContainerStyle}">
<!-- ...your column definitions. -->
</GridView>
</ListView.View>
</ListView>
您必須創建一個自定義方法來遞回遍歷網格視圖列標題的可視化樹,檢查子元素的型別和名稱以獲得正確的。
public T GetChild<T>(DependencyObject dependencyObject, string name) where T : FrameworkElement
{
if (dependencyObject == null)
return null;
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i )
{
var child = VisualTreeHelper.GetChild(dependencyObject, i);
if (child is T frameworkElement && frameworkElement.Name.Equals(name))
return frameworkElement;
var nextChild = GetChild<T>(child, name);
if (nextChild != null)
return nextChild;
}
return null;
}
然后在事件處理程式中,您可以傳遞sender列標題。
private void ListView_ColumnHeaderClick(object sender, RoutedEventArgs e)
{
var gridViewColumnHeader = (GridViewColumnHeader)sender;
var arrow = GetChild<Path>(gridViewColumnHeader, "arrow");
// ... do something with arrow.
return;
}
盡管此解決方案有效并且是解決您的問題的合法且正式記錄的方式,但您通常不必以這種方式遍歷可視化樹。在大多數情況下,這不是必需的,因為使用資料系結可以更優雅、更輕松地解決很多問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/478205.html
上一篇:帶有子UserControl/ViewModel資料系結問題的WPFMVVM父視圖/ViewModel
下一篇:WinUI3是否有Microsoft.Toolkit.Uwp.UI.Controls.RangeSelector的等價物?
