0

.NET 3.5 の使用

背景にUserControlLinearGradientBrushがあります。

ユーザーコントロールのプロパティが変更されたときに、コントロール全体を別の色に変更して脈動させるにはどうすればよいでしょうか。

たとえばMyUserControl.Prop1 = 20、色を赤に変更して脈動すると言った場合(脈動とは、明るくなってから暗くなり、前後に切り替えることを意味します)。その後 MyUserControl.Prop1 = 0、元の色に戻ります。

別の色を使用するときにグラデーションの背景を維持したいのですが、それが不可能な場合はそうしてください

ポインタやリンクは素晴らしいでしょう。これをグーグルで検索しましたが、役立つものは何も見つかりませんでした。

これは私の UserControl です

<UserControl x:Class="StatusPanel"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Margin="11" >

<Grid>
    <Border Margin="-5" BorderBrush="Black" BorderThickness="1" CornerRadius="30" >
    <Border.Effect>
        <DropShadowEffect />
    </Border.Effect>

    <Border.Background >
        <LinearGradientBrush EndPoint="0,0" StartPoint="1,1">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="Silver" Offset="1"/>
        </LinearGradientBrush>
    </Border.Background>
    </Border>

    <StackPanel Orientation="Vertical">
            <!-- All my user contraols defined here -->
    </StackPanel>    
</Grid>    
</UserControl>
4

2 に答える 2

2

Prop1 に基づいてこのようなことを行うのは少し珍しいです。より一般的には、Hover や Focused などの視覚的な状態で行います。

この質問に対する答えは、使用している WPF のバージョンによっても異なります。あなたは指定しません。少なくとも .Net 4.0 を使用している場合は、VisualStateManagerを利用することをお勧めします。これは、コントロール テンプレートだけでなくユーザー コントロールでも機能しますが、手作業が少し必要になるだけです。:) 例えば:

<UserControl 
    x:Class="WpfUserControlTestLibrary.Pulse"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup Name="Prop1State">

            <VisualState Name="Default">
                <Storyboard />
            </VisualState>

            <VisualState x:Name="Error">
                <Storyboard>
                    <ColorAnimation 
                        To="Pink" 
                        Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" 
                        Duration="0:0:2" />
                    <ColorAnimation 
                        To="Maroon" 
                        Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" 
                        Duration="0:0:2" />
                    <ColorAnimation 
                        To="Red" 
                        Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" 
                        BeginTime="0:0:2" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever" />
                    <ColorAnimation 
                        To="Blue" 
                        Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" 
                        BeginTime="0:0:2" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever" />
                </Storyboard>
            </VisualState>

        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <Border BorderBrush="Black" BorderThickness="1" CornerRadius="30" Margin="-5">
        <Border.Effect>
            <DropShadowEffect />
        </Border.Effect>

        <Border.Background>
            <LinearGradientBrush EndPoint="0 0" StartPoint="1 1">
                <GradientStop x:Name="Stop1" Color="White" Offset="0" />
                <GradientStop x:Name="Stop2" Color="Silver" Offset="1" />
            </LinearGradientBrush>
        </Border.Background>
        <StackPanel Orientation="Vertical" Margin="15">
            <Button Content="Default" Click="Button_Click_1" />
            <Button Content="Error" Click="Button_Click" />
        </StackPanel>

    </Border>
</UserControl>

次のコードビハインドを使用:

private void Button_Click(object sender, RoutedEventArgs e)
{
    VisualStateManager.GoToElementState(this, "Error", false);
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    VisualStateManager.GoToElementState(this, "Default", false);
}
于 2012-07-27T12:29:28.033 に答える
1

なんらかの理由でコメントを投稿できません!

良い答えグレッグ、ありがとう。残念ながら私は3.5を使用しています..私が最初にQに尋ねたときにそれを言及するのを忘れました

これは私がそれを解決するためにしたことです:

<UserControl.Resources>
    <Storyboard Name="FadeOutStoryboard" x:Key="FadeOutStoryboard" >
        <DoubleAnimation Storyboard.TargetName="userControlStatusPanel" 
                         Storyboard.TargetProperty="Opacity" 
                         From="1" To="0" Duration="0:0:3" RepeatBehavior="Forever"  />
    </Storyboard>
</UserControl.Resources>

        Storyboard sb = (Storyboard)UserControl.FindResource("FadeOutStoryboard");
        LinearGradientBrush myBrush = new LinearGradientBrush();
        myBrush.EndPoint = new Point(0, 0);
        myBrush.StartPoint = new Point(1, 1);

        if (runProgress.Percent == 100)
        {
            myBrush.GradientStops.Add(new GradientStop(Colors.Green, 0));
            myBrush.GradientStops.Add(new GradientStop(Colors.Silver, 1));
            sb.Stop();
        }
        else (runProgress.Percent <= 100)
        {
            myBrush.GradientStops.Add(new GradientStop(Colors.Red, 0));
            myBrush.GradientStops.Add(new GradientStop(Colors.Silver, 1));
            sb.Begin();
        }
        UserControl.borderMain.Background = myBrush;
    }
于 2012-07-27T16:36:45.710 に答える