如何 read/get UWP 中 FrameworkElement 的样式值?

How to read/get Style values of FrameworkElement in UWP?

我需要读取 Padding 等存储在 Button(或其他 FrameworkElement)的 Style 中的值。如何做到这一点?

例如,如果我像这样为 Button 制作 Style

Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(Button.HeightProperty, 70));
MyButton.Style = style;

所以...我以后如何阅读 Setter HeightProperty?那么下面的情况呢?如何获得Padding?

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
                <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                <ContentPresenter x:Name="ContentPresenter"
                    Padding="11,15,7,0"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

我试图通过

获取信息
Style ButtonStyle = MyButton.GetStyle(); 

但在这之后我完全不知道如何继续。

在第一种情况下,您可以使用 GetValue 方法获取当前应用的值:

var value = (double)MyButton.GetValue(Button.HeightProperty);

或者更简单:

var value = MyButton.Height;

在第二种情况下,问题有点复杂,因为 Padding 是模板本身的一部分,而不是按钮。要访问它,您将需要以下辅助方法:

public IEnumerable<TChildType> FindChildren<TChildType>(DependencyObject parent)
{
    var count = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < count; i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is TChildType typedChild)
        {
            yield return typedChild;
        }

        foreach (var nestedChild in FindChildren<TChildType>(child))
        {
            yield return nestedChild;
        }
    }
}

这会遍历父项下的 VisualTree 并搜索某种类型的后代。我们可以这样使用它:

var contentPresenter = FindChildren<ContentPresenter>(MyButton).First();
Debug.WriteLine(contentPresenter.Padding);

确保仅在页面实际加载后调用 FindChildren 方法(例如在 Page.Loaded 事件处理程序或 OnNavigatedTo 中),如 Page 构造函数,模板子项尚不存在,助手将 return 没有子项。