1

異なる VisualState 間でコントロールのある種の共有リソース (つまり、ブラシ) を変更する簡単な方法があるかどうか疑問に思っています。たとえば、Brush を定義して、Border の Background と別の Rectangle の Fill の両方として使用したいと考えています。別の VisualState で、この背景ブラシを 1 か所 (リソース) で変更し、リソースを使用するすべての要素に反映させたいと考えています。

VisualState の Storyboard の TargetName の名前 (キーではなく) でリソースを参照できるかどうかはわかりません。

XAML でやろうとしていることの簡単な例を次に示します。

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication.MainPage"
Width="200" Height="200">
<UserControl.Resources>
    <SolidColorBrush x:Name="Background" x:Key="Background" Color="Black" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="MyStates">
            <VisualState x:Name="Normal"/>
            <VisualState x:Name="Red">
                <Storyboard>
                    <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="Background" Storyboard.TargetProperty="(Color)">
                        <EasingColorKeyFrame KeyTime="00:00:00" Value="Red"/>
                    </ColorAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Border Background="{StaticResource Background}" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Red" BorderThickness="1"/>
    <Rectangle Fill="{StaticResource Background}" Width="100" Height="100" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
</Grid>
</UserControl>

これらはSilverlightのStaticResourcesであるため、一度しかロードされず、変更できないと感じています。私は、WPF に DynamicResources の概念があることを知っています。すべての要素でブラシを再定義することなく、Silverlight でこの種の動作を実現する方法はありますか?

4

1 に答える 1

0

残念ながら、DynamicResources は Silverlight には存在しません。

バインディングを使用する人もいます。

1 つの UserControl 内でエクスペリエンスをシミュレートするための巧妙な方法があります。

以下のコードで起こっていることは、Storyboard が 1 つの四角形の Fill をアニメーション化し、それが Element バインディングを使用して UserControl 内の他の Fill にバインドされることだけです。これが機能するために、ソースの四角形が表示されている必要はありません。

<UserControl x:Class="TestSilverlightStuff.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"
    xmlns:local="clr-namespace:TestSilverlightStuff"            
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <SolidColorBrush x:Key="Background" Color="Black" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="MyStates">
                <VisualState x:Name="Normal"/>
                <VisualState x:Name="Red">
                    <Storyboard>
                        <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="trickyRectangle" d:IsOptimized="True"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Rectangle Fill="Black" x:Name="trickyRectangle" Visibility="Collapsed" />
        <Border Background="{Binding Fill, ElementName=trickyRectangle}" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Red" BorderThickness="1"/>
        <Rectangle Fill="{Binding Fill, ElementName=trickyRectangle}" Width="100" Height="100" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
        <Button Content="Button" Height="57" HorizontalAlignment="Left" Margin="12,231,0,0" Name="button1" VerticalAlignment="Top" Width="153" Click="button1_Click" />
    </Grid>
</UserControl>

C# のボタン クリック コードは次のとおりです。

private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
    VisualStateManager.GoToState(this, "Red", true);
}

DynamicResource ほどエレガントではありませんが、場合によっては機能します。

于 2010-07-31T01:51:22.963 に答える