如何在UWP中读取/获取FrameworkElement的样式值?

时间:2019-07-12 08:03:50

标签: c# xaml uwp properties setter

我需要读取Padding(或其他Style)的Button中存储的FrameworkElement等值。该怎么做?

例如,如果我像这样为Style做一个Button

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(); 

但是在此之后我根本不知道如何继续。

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您可以使用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中)构造函数,模板子代还不存在,帮助器将不返回任何子代。