0

私の MainWindow には、次のように定義された ContentControl があります。

<ContentControl x:Name="rectangle"  Width="150" Height="150" Canvas.Top="150" Canvas.Left="470" Selector.IsSelected="True" Style="{StaticResource DesignerItemStyle}">
    <Rectangle Fill="Blue" Stretch="Fill" IsHitTestVisible="False" />
</ContentControl>

DesignerItem.xaml は (MoveThumb および RotateThumb と呼ばれるクラスに使用されます。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:dr="clr-namespace:DragAndRotate">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="MoveThumb.xaml" />
    <ResourceDictionary Source="RotateDecorator.xaml" />
</ResourceDictionary.MergedDictionaries>

<Style x:Key="DesignerItemStyle" TargetType="ContentControl">
    <Setter Property="MinHeight" Value="50" />
    <Setter Property="MinWidth" Value="50" />
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5" />
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                    <Control Name="RotateDecorator"
                             Template="{StaticResource RotateDecoratorTemplate}"
                             Visibility="Collapsed" />
                    <dr:MoveThumb Template="{StaticResource MoveThumbTemplate}" Cursor="SizeAll" />
                    <ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="Selector.IsSelected" Value="True">
                        <Setter TargetName="RotateDecorator" Property="Visibility" Value="Visible" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

そして、回転中に変更される長方形の角度を取得し、MainWindow のテキスト ボックスにバインドします。RotateThumb によってリアルタイムで変更された変数を含む INotifyPropertyChanged を実装する bridge という新しいクラスを作成してグローバル変数を試し、それを MainWindow の TextBox にバインドしましたが、機能しません。これも私の意見ではエレガントではありません。

クラス RotateThumb で変化する変数を取得して TextBox にバインドする方法はありますか? 前もって感謝します。

RotateDecorator.xaml は、Control をドラッグして回転できることを示すメタファーを提供するだけです。以下はRotateThumbで、DragDeltaでrotateTransform.Angleを変更したい:

public class RotateThumb : Thumb
{
    private Point centerPoint;
    private Vector startVector;
    private double initialAngle;
    private Canvas designerCanvas;
    private ContentControl designerItem;
    private RotateTransform rotateTransform;

    public RotateThumb()
    {
        DragDelta += new DragDeltaEventHandler(RotateThumb_DragDelta);
        DragStarted += new DragStartedEventHandler(RotateThumb_DragStarted);
    }

    private void RotateThumb_DragStarted(object sender, DragStartedEventArgs e)
    {
        this.designerItem = DataContext as ContentControl;

        if (this.designerItem != null)
        {
            this.designerCanvas = VisualTreeHelper.GetParent(designerItem) as Canvas;
            if (this.designerCanvas != null)
            {
                this.centerPoint = this.designerItem.TranslatePoint(new Point(this.designerItem.Width * this.designerItem.RenderTransformOrigin.X, this.designerItem.Height * this.designerItem.RenderTransformOrigin.Y), this.designerCanvas);
                Point startPoint = Mouse.GetPosition(this.designerCanvas);
                this.startVector = Point.Subtract(startPoint, this.centerPoint);
                this.rotateTransform = this.designerItem.RenderTransform as RotateTransform;
                if (this.rotateTransform == null)
                {
                    this.designerItem.RenderTransform = new RotateTransform(0);
                    this.initialAngle = 0;
                }
                else
                    this.initialAngle = this.rotateTransform.Angle;
            }
        }
    }

    void RotateThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        if (this.designerItem != null && this.designerCanvas != null)
        {
            Point current = Mouse.GetPosition(this.designerCanvas);
            Vector deltaVector = Point.Subtract(current, this.centerPoint);
            double angle = Vector.AngleBetween(this.startVector, deltaVector);
            RotateTransform rotateTransform = this.designerItem.RenderTransform as RotateTransform;
            rotateTransform.Angle = this.initialAngle + Math.Round(angle, 0);
            this.designerItem.InvalidateMeasure();
        }
    }
}

以下はブリッジです。RotateThumb で角度を付ける方法がわからないため、「ブリッジ」を作成し、MainWindow.Textbox のコンテキストをそれにバインドできることを願っています。

public class Bridge : INotifyPropertyChanged
{
    private string angletext;

    public string Angle
    {
        get { return angletext; }
        set
        {
            if (value != angletext)
            {
                angletext = value;
                Console.WriteLine(angletext);
                OnPropertyChanged(new PropertyChangedEventArgs("Angle"));
            }
        }
    }

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public static Bridge bridge = new Bridge();
4

1 に答える 1

0

あなたのケースは、通常のバインディングがやや役に立たないケースの 1 つです。

RotateThumb クラスでは、カスタム調整された RoutedCommand を公開します。この RoutedCommand は、親指が変わるたびに現在の角度を運ぶコマンドを起動します。RoutedCommand はビジュアル ツリーをバブルアップするため、ウィンドウで着信通知をキャッチするのは非常に簡単です。

唯一の (相対的な) 問題は、ビジュアル ツリーが完全に構築されるとすぐに通知を受けることです。(想定される) サム値の変更がないため、所有ウィンドウには通知されません。ただし、初期 (デフォルト) サム値はウィンドウによって認識されていると想定できます。

それが役に立てば幸い。

于 2013-09-21T05:22:51.903 に答える