0

私はWPFが初めてなので、これを行う方法が少しわかりません。UserControl今日は、2 つの点線が交差する円を表示するグリッドで構成される非常に単純なビジュアルを作成しました。目的は、指定された半径サイズの円を表示することです。高さと幅を非表示にして、コントロールのサイズを設定するために呼び出されるカスタム プロパティを使用できるようにしたいと考えています。RadiusSize

コード ビハインドはRadiusSize依存関係プロパティを次のように定義します。

public static readonly DependencyProperty RadiusSizeProperty =
    DependencyProperty.Register("RadiusSize", typeof(double), typeof(Radius));

public double RadiusSize
{
    get { return (double)GetValue(RadiusSizeProperty); }
    set 
    { 
        SetValue(RadiusSizeProperty, value);
        Height = value * 2;
        Width = value * 2;
        RaisePropertyChanged("RadiusSize");
    }
}

残念ながら、特定のコントロールの XAML を設定してRadiusそれを渡す場合、Height または Width プロパティに目に見える変更はありません。RadiusSize削除すると、デフォルトでAuto. 私がやりたいことは可能ですか?

4

4 に答える 4

2

問題は、DependencyProperty の周りの「clr ラッパー プロパティ」のセッターにロジックを配置したことです。これは WPF では機能しません。DependencyProperty の宣言で、コードを DependencyPropertyChangedCallback に入れる必要があります。このチュートリアルを見てください

それとは別に、楕円を使用して画面上に円を描くことができます。独自に実装する必要はありません。

RaisePropertyChanged メソッドは何をしますか? DependencyObject ベースのクラスに INotifyPropertyChanged を実装しないでください。

于 2012-10-31T18:07:41.840 に答える
2

はい、可能です。いいえ、あなたはそれを正しくしていません。

円の幅/高さをどのように設定しているかを伝えるのは少し難しいですが、コードにある明らかな初心者のエラーは、DependencyProperty のセッター内で何かを行っていることです。

DPBinding、プロパティのゲッター/セッターを介してアクセスされません。 バインディング システムはバックグラウンドで動作するため、クラスの DP にバインドすると、バインディングが更新されたときにゲッター/セッターが呼び出されません。

それで、代替案は何ですか?たくさんの。コールバックを指定するプロパティ宣言にPropertyMetadataインスタンスを追加し、そのコールバックで他のプロパティを更新できます...または完全に回避できます。私は2番目に行きます。

楕円とその他の描画を含む UserControl を作成する場合は、ViewBox内のビジュアルを平手打ちして、UserControl のサイズに合わせて自動的に拡大し、半径全体を忘れます。

ただし、半径にまだ関心がある場合は、IValueConverter を使用して作業を行うことができます。

public class RadiusConverter : IValueConverter
{
    public object Convert(object value, /*snip*/)
    {
        // check null, type, and double.NaN here
        return (double)value * 2;
    }
    /* snip, on the round trip same as before but / 2 */
}

Radius次に、あなたが持っているように UserControl でプロパティを定義し、

<UserControl x:Class="Derp"
    Width="{Binding Radius, Converter={StaticResource RadiusConverter}, RelativeSource={RelativeSource Self} />
<!-- snip -->
于 2012-10-31T18:07:44.507 に答える
0

コントロールの高さを設定するときに、内部の円の高さを変更していない可能性があります。含まれている円とグリッドの高さを設定してみてください。

于 2012-10-31T18:06:21.967 に答える
0

別のポスターが指摘したように、プロパティ システムを使用して高さと幅を設定することはできません。代わりに、コントロールの高さと幅を自動的に設定したい場合は、RadiusSizePropertyDependencyProperty のコールバックを定義する必要があります。

RadiusSize を設定すると、次のように Height と Width が設定されます。

    Public Shared RadiusSizeProperty As DependencyProperty = DependencyProperty.Register("RadiusSize",
                                                             GetType(Double),
                                                             GetType(Radius),
                                                             New PropertyMetadata(0.5, Sub(s, e)

                                                                                           Dim p As DependencyPropertyChangedEventArgs = e
                                                                                           Dim o As DependencyObject = s
                                                                                           o.SetValue(HeightProperty, p.NewValue)
                                                                                           o.SetValue(WidthProperty, p.NewValue)
                                                                                       End Sub))
于 2012-10-31T18:07:56.660 に答える