2

私はWPFに本当に慣れていないので、スタイルに関係するいくつかのことを理解するのに苦労しています。まず、スタイルはどこにもエラーをスローしませんが、それが完全に正しいかどうかはまだわかりません...そのため、スタイルの XAML を次に示します。

編集: スタイルは、カスタム ユーザー コントロールが Storyboard と DoubleAnimation を使用してフェードインできるようにする必要があります

<Application.Resources>
    <Style TargetType="{x:Type UserControl}" x:Key="UCStyle">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Visibility}" Value="Visible">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="UserControl.Opacity" From="0.0" To="1.0" Duration="0:0:3">

                            </DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Application.Resources>

ここから、チェックボックスを使用してユーザーコントロールをキャンバスの子に追加します。

private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        UserControlLibrary.UserControl1 userControl = new UserControlLibrary.UserControl1();
        userControl.Style = Resources["UCStyle"] as Style;
        canvas1.Children.Add(userControl);
    }

私はSOについて読んだところ、キーをスタイルとして参照して、プログラムでスタイルを適用する方法であることを示唆するいくつかの回答が見つかりました。ただし、これを実行すると、ユーザーコントロールがフェードインしているようには見えません (スタイリングが示唆するように)。

ここで重要な何かが欠けていますか? それとも少しばかげているだけですか?

編集2:

チェックボックスをチェックしたイベントを変更して、キャンバスに追加した後に可視性を非表示に設定し、クリックイベントで可視性を可視に設定する新しいボタンを追加しましたが、残念ながら問題は解決しませんでした。

4

1 に答える 1

2

DataTriggerにバインドしている を使用していますが、代わりにUserControl.DataContext.VisibilityにバインドしたいUserControl.Visibilityので、別のバインド タイプを使用する必要があります。

すべてのバインディングはデフォルトで を参照するDataContextため、 以外のものを参照するには、バインディングDataContextに別のソースを指定する必要があります。RelativeSourceSelf

<DataTrigger Binding="{Binding Visibility, RelativeSource={RelativeSource Self}}" Value="Visible">

Trigger別の方法として、 の代わりに通常の を使用できますDataTrigger。これは、バインディングを介してプロパティを見つけようとするのではなく、UserControl のプロパティに基づいてトリガーする必要があります。

<Trigger Property="Visibility" Value="Visible">
于 2012-10-23T14:54:01.633 に答える