0

ここで配列が本当に問題なのかどうかはわかりませんが、MouseUp イベントが発生したときに、ウィンドウの一方の側から他方の側に移動したい四角形があります。この四角形を配列要素にバインドし、MouseUp イベント ハンドラー メソッドがその配列の値を変更します。長方形の位置を切り替えるだけでなく、メッセージボックスを正常にプルアップできるため、ハンドラーメソッドが機能することを私は知っています。

注: 配列が必要です。これは、これらの概念をテストするための単なるコードであり、実際のプロジェクトではありません。

また、この問題を解決する最も簡単な方法も大歓迎です。

C# コード:

namespace WPFTestingApplication
{
    public static class GridProperties
    {
        public static int[] gridColumn = { 0 };
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Rect_MouseUp_1(object sender, MouseButtonEventArgs e)
        {
            GridProperties.gridColumn[0] = 1;
        }
    }
}

XAML コード:

<Window x:Class="WPFTestingApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFTestingApplication"
        Title="MainWindow" Height="200" Width="400">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Rectangle Name="Rect" Grid.Column="{Binding [0], Source={x:Static local:GridProperties.gridColumn}, Mode=OneWay}" Fill="DarkGray" Margin="5" MouseUp="Rect_MouseUp_1"/>
    </Grid>
</Window>
4

2 に答える 2

0

さて、ここで Windows フォームの考え方を片付ける必要があります (へー)。WPF では、機能外観の分離について考える必要があります。つまり、コード (c#) で機能面を決定できるようにし、xaml でテンプレートを作成して外観を整えます。

実際に必要な機能はThumbの機能です。サムにはすでにドラッグ機能が組み込まれているため、テンプレートを作成して外観を与えるだけです。

まずこれを見てください:

http://wpf.2000things.com/tag/dragging/

次のような親指から派生する独自のクラスを作成することで、これに取り組みます。

// Although the visual template we're applying is a circle,
// the FUNCTIONALITY is primarily that of a thumb. So that's what 
// we'll use. A thumb is essentially a 'draggable thing'.
class DragCircle : System.Windows.Controls.Primitives.Thumb
{      
    public DragCircle()
    {
        // Thumbs _track_ movement, but they don't actually move. We have to handle this ourselves.
        // We do this by setting the Canvas.Left/Canvas.Top attached properties. Of course, for this
        // to work our DragCircle has to be placed on a Canvas, otherwise there's no-one to read the property.
        // IMPORTANT! In order to read the Canvas position later, it needs to have a record in the WPF 
        // dependency property table. So for now we'll just set it to '0' as a default.
        Canvas.SetLeft (this, 0);
        Canvas.SetTop (this, 0);

        // The drag-delta event occurs when the Thumb is dragged. 'delta' represents "change" just like
        // we all learned in calculus.
        this.DragDelta += new System.Windows.Controls.Primitives.DragDeltaEventHandler(DragCircle_DragDelta);
    }

    void DragCircle_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        // Read the Canvas location from the WPF database.
        Double currentX = Canvas.GetLeft(this);
        Double currentY = Canvas.GetTop(this);

        // Now update the canvas attached properties using the drag-delta ('change in position').
        // Note that Canvas.SetLeft is just a helper function that maps to the attached property: 
        //  this.SetValue(Canvas.TopProperty, SOME_VALUE);
        Canvas.SetLeft(this, currentX + e.HorizontalChange);
        Canvas.SetTop(this, currentY + e.VerticalChange);
    }
}

次に、次のようなテンプレートを作成します。

<Window.Resources>
    <Style TargetType="lol:DragCircle">
        <Setter Property="Foreground" Value="LightGreen" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="lol:DragCircle">
                    <Ellipse Width="20" Height="20" Fill="{TemplateBinding Foreground}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="Orange" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

キャンバスにドロップすれば完了です。

<Canvas>
    <lol:DragCircle Canvas.Left="100" Canvas.Top="200" />
    <lol:DragCircle Canvas.Left="50" Canvas.Top="50" />
    <lol:DragCircle Canvas.Left="300" Canvas.Top="400" />
</Canvas>
于 2013-02-05T16:31:18.440 に答える
0

配列が問題です。INotifyPropertyChangedを読む必要があります。バインド先は何も更新されません。

可能であれば、配列をその要素の変更をObservableCollection実装する に変更してください。INotifyPropertyChanged配列と同じようにインデックスを付けることができます。

プロパティ コレクションを静的クラスに格納する際にも問題が発生する場合があります。静的クラスとプロパティには、プロパティ変更通知がありません。GridProperties をウィンドウ クラスのプロパティにすることができれば、より簡単になります。次に、ウィンドウの DataContext をそれ自体に設定します。

あなたの例では、このようなものが機能します。ただし、実際のプロジェクトでもっと複雑なものがあるかどうかはわかりません。

C#:

public partial class MainWindow : Window
{
    public ObservableCollection<int> GridProperties { get; private set; }

    public MainWindow()
    {
        InitializeComponent();
        GridProperties = new ObservableCollection<int>();
        GridProperties.Add(0);
        DataContext = this;
    }

    private void Rect_MouseUp_1(object sender, MouseButtonEventArgs e)
    {
        GridProperties[0] = 1;
    }
}

xaml:

<Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Rectangle Name="Rect" Grid.Column="{Binding GridProperties[0]}" Fill="DarkGray" Margin="5" MouseUp="Rect_MouseUp_1"/>
</Grid>
于 2013-02-06T14:21:01.283 に答える