0

Drawingから派生するクラスを定義しましたFrameworkElement。これを使って上に描画していDrawingVisualます。私XAMLはこのローカルクラスを含めました。

ここで私の質問は、このクラスのプロパティを変数にバインドする方法、またはそれらを変更する方法です。

たとえば、widthプロパティを変更したいとしましょう。に を含めてButtonXAML変更しようとしましたwidthが、何も起こりません。

必要なコードはすべて以下のとおりです。

<Window x:Class="Geom.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:geom="clr-namespace:Geom"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <Canvas Width="0" Height="0">
            <geom:Drawing x:Name="Drawing" />
        </Canvas>
        <Button Grid.Row="1" Content="Change" Click="ButtonBase_OnClick"/>
    </Grid>
</Window>


public class Drawing : FrameworkElement
{
    private readonly VisualCollection _visuals;
    public int width { get; set; }

    public Drawing()
    {
        RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
        _visuals = new VisualCollection(this);

        var geometryGroup = new GeometryGroup();
        width = 50;
        var depth = 50;
        var x = 50;
        var y = 50;
        var rect = new Rect(x, y , width, depth);
        var rectGeom = new RectangleGeometry(rect);
        geometryGroup.Children.Add(rectGeom);
        geometryGroup.Freeze();

        var drawingVisual = new DrawingVisual();
        using (var dc = drawingVisual.RenderOpen())
        {
            dc.DrawGeometry(Brushes.Blue, null, geometryGroup);
        }
        _visuals.Add(drawingVisual);
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[0];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }
}


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

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Drawing.width = 10;
    }
}
4

1 に答える 1

1

DrawingVisual を更新するには、そのdrawingContext でビジュアルを新しい値で再描画する必要があります。

したがって、幅を設定する場合は、描画コンテキストでビジュアルを再描画する必要があります。コードを次のように変更します。

public class Drawing : FrameworkElement
{
    private readonly VisualCollection _visuals;

    private int width;
    public int VisualWidth
    {
        get { return width; }
        set
        {
            width = value;
            RefreshDrawing();
        }
    }

    public Drawing()
    {
        RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
        _visuals = new VisualCollection(this);

        var geometryGroup = new GeometryGroup();
        width = 50;
        DrawingVisual drawingVisual = new DrawingVisual();
        RefreshDrawing(drawingVisual);
        _visuals.Add(drawingVisual);
    }

    private void RefreshDrawing(DrawingVisual drawingVisual = null)
    {
        var geometryGroup = new GeometryGroup();
        var rect = new Rect(50, 50, VisualWidth, 50);
        var rectGeom = new RectangleGeometry(rect);
        geometryGroup.Children.Add(rectGeom);
        geometryGroup.Freeze();

        drawingVisual = drawingVisual ?? (DrawingVisual)GetVisualChild(0);
        using (var dc = drawingVisual.RenderOpen())
        {
            dc.DrawGeometry(Brushes.Blue, null, geometryGroup);
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[0];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }
}

VisualWidthボタン クリック ハンドラから設定します。

Drawing.VisualWidth = 10;
于 2014-08-03T09:41:16.923 に答える