如果我的项目使用代码(App.cs与App.Xaml),我可以在Xaml中定义一个我可以在代码中引用的样式吗?

时间:2017-11-02 20:53:34

标签: c# xaml xamarin.forms uwp-xaml xamarin.uwp

我尝试在UWP中自定义Picker的外观(我想删除下拉箭头),并且我在UWP App.Xaml中定义了一个控件模板,类似于:

<Application
    x:Class="StoreFulfillment.UWP.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:StoreFulfillment.UWP"
    RequestedTheme="Light">
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Name="PickerStyle" TargetType="ComboBox">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ComboBox">
                            <Grid>
                            ...
                            ...
                            ...
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>

在我的选择器自定义渲染器中,我想将Picker UWP控件(它是一个ComboBox)的Style属性设置为Xaml中定义的PickerStyle,如下所示:

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
    base.OnElementChanged(e);
    ...
    ...
    ...
    Control.Style = (Windows.UI.Xaml.Style)Application.Current.Resources["PickerStyle"];
}

但是Application.Current.Resources不包含我在Xaml中定义的样式。如何引用它或从自定义渲染器访问它?

2 个答案:

答案 0 :(得分:2)

您错过了x:Key上的Style属性,因为它可以像这样检索它。您可以找到更多详细信息here

<Style x:Key="PickerStyle" TargetType="ComboBox">
    <Setter Property="Template">
        <Setter.Value>
            ...

答案 1 :(得分:1)

资源可以有KeyName。不建议同时指定两者。在您的情况下 - 如果Control.Style = this.PickerStyle;中定义Control,您可以简单地说Application。如果它位于不同的页面中,您可以执行Control.Style = ((App)Application.Current).PickerStyle;如果您更愿意使用资源键 - 请按照G的回答。