41353


<http://d.hatena.ne.jp/CoMo/20110316/>  
<http://zawapro.com/?p=988>

上記を参考に以下のようにしました。

グリッド模様は表示されるのですが、「ドラッグ対象のオブジェクト」が表示されません。

グリッド模様を構築処理によって「ドラッグ対象のオブジェクト」が上書きされているのだと思うのですが、  
ドラッグ対象のオブジェクトを再度描画させるにはどのようにすべきなのでしょうか？

MainWindow.xamlファイル

[code]

      <Canvas Grid.Row="2" Name="canvas" SnapsToDevicePixels="True" Loaded="canvas_Loaded" SizeChanged="canvas_SizeChanged">
            <Thumb DragDelta="Thumb_DragDelta" Canvas.Left="0" Canvas.Top="0">
                <Thumb.Template>
                    <ControlTemplate>
                        <!--ドラッグ対象のオブジェクトを定義する-->
                        <Grid Width="100" Height="30">
                            <Ellipse Fill="LightBlue" Stroke="Blue" />
                            <TextBlock Text="動く物体" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Grid>
                    </ControlTemplate>
                </Thumb.Template>
            </Thumb>
        </Canvas>
    
[/code]

MainWindow.xaml.csファイル

[code]

      public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            //Thumbコントロールのドラッグイベント処理
            private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
            {
    
                var thumb = sender as Thumb;
                if (thumb == null) return;
    
                //ドラッグ量に応じてThumbコントロールを移動する
                Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange);
                Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange);
            }
    
            private const int GRID_SIZE = 50;
            private ScaleTransform scaleTransform = new ScaleTransform();
    
            private void canvas_Loaded(object sender, RoutedEventArgs e)
            {
                BuildView();
            }
    
            private void canvas_SizeChanged(object sender, SizeChangedEventArgs e)
            {
                BuildView();
            }
    
            // グリッド模様の構築
            private void BuildView()
            {
                canvas.Children.Clear();
    
                // 縦線
                for (int i = 0; i < canvas.ActualWidth; i += GRID_SIZE)
                {
                    Path path = new Path()
                    {
                        Data = new LineGeometry(new Point(i, 0), new Point(i, canvas.ActualHeight)),
                        Stroke = Brushes.Aqua,
                        StrokeThickness = 1
                    };
    
                    path.Data.Transform = scaleTransform;
    
                    canvas.Children.Add(path);
                }
    
                // 横線
                for (int i = 0; i < canvas.ActualHeight; i += GRID_SIZE)
                {
                    Path path = new Path()
                    {
                        Data = new LineGeometry(new Point(0, i), new Point(canvas.ActualWidth, i)),
                        Stroke = Brushes.Aqua,
                        StrokeThickness = 1
                    };
    
                    path.Data.Transform = scaleTransform;
    
                    canvas.Children.Add(path);
                }
            }
        }
    
[/code]


CC BY-SA 3.0
2018-01-31T10:32:23.403
41352
2018-01-31T11:36:31.780
12842
question
c# visual-studio wpf
VisualC#　Thumbオブジェクトを再描画させたい


`BuildView()`の`canvas.Children.Clear()`が原因です。`Thumb`のみを残すように

[code]

    canvas.Children.RemoveRange(1, canvas.Children.Count - 1);
    
[/code]

と変えてみてください。

なおグリッド模様程度であれば`canvas.Children`を弄らなくても`DrawingBrush`で十分対応できます。

[code]

    <Canvas>
        <Canvas.Background>
            <DrawingBrush
                ViewportUnits="Absolute"
                Viewport="0,0,50,50"
                TileMode="Tile">
                <DrawingBrush.Drawing>
                    <GeometryDrawing>
                        <GeometryDrawing.Pen>
                            <Pen
                                Brush="Aqua" />
                        </GeometryDrawing.Pen>
                        <GeometryDrawing.Geometry>
                            <RectangleGeometry
                                Rect="0,0,50,50" />
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Canvas.Background>
    </Canvas>
    
[/code]


CC BY-SA 3.0
2018-01-31T11:27:19.477
41353
2018-01-31T11:36:31.780
2018-01-31T11:36:31.780
5750
5750
41352
answer