Что может препятствовать применению стилей к элементу управления Silverlight во время выполнения? - PullRequest
1 голос
/ 02 января 2011

Я написал простое приложение Silverlight. Мои стили отображаются правильно во время разработки, но когда я пытаюсь запустить приложение, любые стили в файле словаря ресурсов, которые объединены в файле app.xaml, не применяются ни к одному элементу управления во время выполнения.

На самом деле, только UserControl стили не применяются. Но остальные работают (как Button на странице). Что может быть причиной этой проблемы и как я могу ее исправить?

Мой код примерно такой:

Styles.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="UserControl">
        <Setter Property="FlowDirection" Value="RightToLeft" />
        <Setter Property="FontFamily" Value="Tahoma" />
        <Setter Property="Background" Value="Aqua" />
    </Style>
    <Style TargetType="Button" >
        <Setter Property="Background" Value="Aqua" />
    </Style>
</ResourceDictionary>

App.xaml:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             x:Class="Silverlight.Test._01.App"
             >
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

MainPage.xaml:

<UserControl x:Class="Silverlight.Test._01.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="This is a test" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="220"   />
        <sdk:Label   Height="28" HorizontalAlignment="Left" Margin="12,6,0,0" Name="label1" VerticalAlignment="Top" Width="351" Content="Test label" />
    </Grid>
</UserControl>

1 Ответ

4 голосов
/ 03 января 2011

По крайней мере, одна из причин, по которой это не работает, заключается в том, что вы никогда не создаете экземпляр UserControl. Вы фактически создаете экземпляр Silverlight.Test._01.MainPage.

Кроме того, в отличие от Button UserControl не устанавливает для свойства DefaultStyleKey элемента управления значение UserControl, фактически попытка установить значение в DefaultStyleKey в коде позади приведет к исключению. *

Нет общего обходного пути для этого. Самое близкое, что вы можете получить, это изменить стиль по умолчанию на стандартный ключевой ресурс: -

<Style x:Key="UserControlDefaultStyle" TargetType="UserControl">
    <Setter Property="FlowDirection" Value="RightToLeft" />
    <Setter Property="FontFamily" Value="Tahoma" />
    <Setter Property="Background" Value="Aqua" />
</Style> 

Теперь измените свой usercontrol xaml, чтобы он выглядел следующим образом: -

<UserControl x:Class="Silverlight.Test._01.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    Style="{StaticResource UserControlDefaultStyle}"    
>

    <Grid x:Name="LayoutRoot" Background="{Binding Parent.Background, ElementName=LayoutRoot}">
        <Button Content="This is a test" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="220"   />
        <sdk:Label   Height="28" HorizontalAlignment="Left" Margin="12,6,0,0" Name="label1" VerticalAlignment="Top" Width="351" Content="Test label" />
    </Grid>
</UserControl>

Обратите внимание, что это не общее решение, поскольку вам необходимо добавить дополнительный атрибут Style к каждому UserControl, который вы создаете.

Также обратите внимание на привязку свойства LayoutRoot Background. Свойство UserControl.Background фактически ничего не делает, вы передаете это значение дочернему элементу управления, чтобы оно имело какой-либо эффект.

...