1

コンテンツを回転できるボタン コントロールを作成したいと考えています。私のクラスはこんな感じです。ApplyRotation は呼び出されますが、テキストは水平のままです。

私は何かを忘れましたか?レイアウトの無効化など...

public class KeyButton : Button
{
    private TextBlock content;
    private Viewbox viewbox;

    #region DEPENDENCY - Angle
    // Dependency Property
    public static readonly DependencyProperty AngleProperty =
         DependencyProperty.Register("Angle", typeof(double),
            typeof(KeyButton),
            new FrameworkPropertyMetadata(0.0, OnAnglePropertyChanged, OnCoerceAngleProperty),
          OnValidateAngleProperty);

    // .NET Property wrapper
    public double Angle
    {
        get { return (double)GetValue(AngleProperty); }
        set { SetValue(AngleProperty, value); }
    }

    private static void OnAnglePropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        KeyButton control = source as KeyButton;
        if (control != null)
        {
            ApplyRotation(control);
        }
    }

    private static object OnCoerceAngleProperty(DependencyObject sender, object data)
    {
        // TODO implement
        return data;
    }

    private static bool OnValidateAngleProperty(object data)
    {
        // TODO implement validation
        return data is double;
    }
    #endregion

    public KeyButton()
    {
        viewbox = new Viewbox();
        content = new TextBlock { Text = "X" };
        this.Content = viewbox;
        viewbox.Child = content;
    }

    private static void ApplyRotation(KeyButton control)
    {
        if (control.viewbox.Child != null)
        {
            control.viewbox.Child.RenderTransform = new RotateTransform(control.Angle);
        }
    }

    protected override void OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs e)
    {

        base.OnPropertyChanged(e);
        switch (e.Property.Name)
        {
            case "Content":
                content.Text = e.NewValue.ToString();
                ApplyRotation(this);
                break;
            default:
                try
                {
                    viewbox.SetValue(e.Property, e.NewValue);
                }
                catch (Exception)
                {
                }
                break;
        }
    }
}

XAMLを使用して試してみましたが、うまくいきました。(ボタンが100個くらいあるので、新しいクラスを作ったほうがいいと思ったのですが…)

<Button Grid.Row="0" Grid.Column="0">
    <Viewbox>
        <TextBlock Text="Hello">
            <TextBlock.RenderTransform>
                <RotateTransform Angle="45"/>
            </TextBlock.RenderTransform>
        </TextBlock>
    </Viewbox>
</Button>
4

2 に答える 2

1

問題は、KeyButton の Content プロパティが以下のように XAML で設定されている場合です。

<KeyButton Content="Hello"/>

コンストラクターで割り当てた Viewbox は、新しいコンテンツ オブジェクトに置き換えられます。オーバーライドされた OnPropertyChanged メソッドはそれを妨げません。その後、メンバーはContentviewboxプロパティと割り当てに含まれなくなります

control.viewbox.Child.RenderTransform = new RotateTransform(...)

はもう見えないので、目に見える効果control.viewboxはありません。

すべてのボタンの回転角度が同じである限り、Erno が示したように、デフォルトのボタン スタイルで ContentTemplate を変更することを強くお勧めします。

于 2012-12-21T15:15:41.527 に答える
0

XAML の方法を引き続き使用できます。

<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Viewbox>
                    <ContentPresenter>
                        <ContentPresenter.RenderTransform>
                            <RotateTransform Angle="45"/>
                        </ContentPresenter.RenderTransform>
                    </ContentPresenter>
                </Viewbox>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
于 2012-12-21T14:22:39.880 に答える