首页 > 解决方案 > 如何找到以另一个控件 UWP 8.1 的样式定义的控件

问题描述

所以这就是交易,我有一个GridView使用 a style,它定义了你在其中看到的几乎所有内容,GridView并在不同的文件中定义。

这使得很难到达其中的控件Style。问题是我无法更改它,因此其中GridView将包含定义,因为它是程序中的标准。

GridView所以我正在寻找的是一种访问在Style.

这是这种风格的定义(大致):

<Style x:Key="GlobalUserHeader" TargetType="GridView">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GridView">
                    <Grid Background="#FF262524" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                        ...
                        <Grid Grid.Column="2" Margin="0">
                            ...
                            <Button x:Name="AuthUserStyleButton" Grid.Column="1" Grid.Row="1" Style="{StaticResource AuthUserStyle}" HorizontalAlignment="Left" Margin="0">
                                <Button.Flyout>
                                    <MenuFlyout Placement="Bottom">
                                        <MenuFlyoutItem Text="{Binding StoreId, Converter={StaticResource TranslateConverter}, ConverterParameter='T_A_Common_SignOut'}" Command="{Binding SignOutCommand}"/>
                                    </MenuFlyout>
                                </Button.Flyout>
                            </Button>
                            ...
                        </Grid>
                        ...
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这是GridView定义:

<GridView x:Name="GlobalUserHeaderGridView" Style="{StaticResource GlobalUserHeader}"/>

我设法达到了ControlTemplate我的代码的水平,但就是这样。如果重要的话,它在命名空间Windows.UI.Xaml.Controls中。

标签: c#uwp

解决方案


如何找到以另一个控件 UWP 8.1 的样式定义的控件

控件具有GetTemplateChild可用于在实例化的ControlTemplate可视化树中检索命名元素的方法。但它是受保护的方法。所以我们需要将这个方法重新封装为公共方法。

public sealed class MyGridView : GridView
{
    public MyGridView()
    {
        this.DefaultStyleKey = typeof(GridView);
    }

    public DependencyObject GetChildWithName(string childName)
    {
        return GetTemplateChild(childName);
    }
}


<Page
    ......
    xmlns:local="using:InkCanvas"
    ......

<local:MyGridView x:Name="GlobalUserHeaderGridView" Style="{StaticResource GlobalUserHeader}"/>

用法

var btn = GlobalUserHeaderGridView.GetChildWithName("AuthUserStyleButton")

推荐阅读