UWP TemplateBinding в ControlTemplate с фиксированным значением - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу связать свойство (myHeight) в моей Controltemplate с родителем.Ниже приведен мой код.

Ресурсный дикт

<Style TargetType="local2:TestingControl" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local2:TestingControl">
                <Border
                    Height="{TemplateBinding myHeight}"
                    Background="Green"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>                            
                        <ContentPresenter Content="{TemplateBinding Content}"/>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

TestingControl.cs

[ContentProperty(Name = "Content")]
public sealed class TestingControl : Control
{
    public TestingControl()
    {
        this.DefaultStyleKey = typeof(TestingControl);
    }

    public static readonly double myHeight = (double)100;

    public object Content
    {
        get { return (string)GetValue(ContentProperty); }
        set { SetValue(ContentProperty, value); }
    }

    public static readonly DependencyProperty ContentProperty =
        DependencyProperty.Register("Content", typeof(string), typeof(TestingControl), new PropertyMetadata(string.Empty));
}

То, что я пытаюсь связать, этомой рост.Я хотел бы иметь это в .cs, так как мне нужно выполнить некоторые операции над ним.Это не удается загрузить полностью!


Я также попробовал следующий подход

Ресурс dict

<x:Double x:Key="myHeight">100</x:Double>
<Style TargetType="local2:TestingControl" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local2:TestingControl">
                <Border
                    Height="{ThemeResource myHeight}"
                    Background="Green"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">

                    <ContentPresenter Content="{TemplateBinding Content}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

TestingControl.cs

[ContentProperty(Name = "Content")]
public sealed class TestingControl : Control
{
    public TestingControl()
    {
        this.DefaultStyleKey = typeof(TestingControl);

        var x  = (double)Resources["myHeight"];
    }

    public object Content
    {
        get { return (string)GetValue(ContentProperty); }
        set { SetValue(ContentProperty, value); }
    }

    public static readonly DependencyProperty ContentProperty =
        DependencyProperty.Register("Content", typeof(string), typeof(TestingControl), new PropertyMetadata(string.Empty));
}

Проблема со вторым подходом заключается в том, что при чтении свойства в коде .cs var x = (double)Resources["myHeight"]; я получаю исключение.

Разрешения для любого (предпочтительнои то и другое, так как я просто пытаюсь выучить UWP), будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 декабря 2018

Первое, что TemplateBinding должен связать свойство зависимостей, и вы пишете статическое поле, которое не может быть привязано к высоте.

Второе, что ThemeResource найдет тему, но вы определите статический источник.

<x:Double x:Key="myHeight">100</x:Double>
<Style TargetType="local2:TestingControl" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local2:TestingControl">
                <Border
                    Height="{StaticResource myHeight}"
                    Background="Green"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">

                    <ContentPresenter Content="{TemplateBinding Content}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

В-третьих, сначала вы получаете ресурс, но ресурс запускается после OnApplyTemplate.

Вы должны переместить код, который получает ресурс, в OnApplyTemplate.

    protected override void OnApplyTemplate()
    {
        try
        {
            // find something in TestingControl.Resources
            var x = Resources["myHeight"];
        }
        catch (Exception e)
        {

        }

        try
        {
            // find something in App.Resources
            var x = App.Current.Resources["myHeight"];
        }
        catch (Exception e)
        {

        }

        base.OnApplyTemplate();
    }

Если ваш ресурс написан в App.xaml, вы должны использовать App.Current.Resources для получения ресурса.

Если вы хотите получить ресурс в вашем таможенном контроле, вы должны добавить ресурс в свой контроль.

    <local:TestingControl>
        <local:TestingControl.Resources>
            <x:Double x:Key="myHeight">100</x:Double>
        </local:TestingControl.Resources>
    </local:TestingControl>
...