没有绘制矩形

时间:2018-04-07 16:39:42

标签: c# wpf

我正在尝试在WPF中制作绘图程序,但我遇到了一些问题。 我可以成功地绘制线条(yeeey)但我也想要填充空间的能力(我的方法是堆叠很多具有相同起点的背诵)。 但当我从" line"切换我的单选按钮时到"填写"它没有任何吸引力。

- drawing(boolean)用于创建填充的起点

代码

private void cnvs_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed && linemode.IsChecked == true)
        {
            Line line = new Line();
            drawing = true;
            line.Stroke = currentbrush;
            line.X1 = currentPoint.X - 9;
            line.Y1 = currentPoint.Y - 9;
            line.X2 = e.GetPosition(this).X - 9;
            line.Y2 = e.GetPosition(this).Y - 9;
            currentPoint = e.GetPosition(this);
            cnvs.Children.Add(line);
        } else if (cnvs.IsFocused == true)
        {
            if (!drawing) rectbeggining = e.GetPosition(this);
            drawing = true;
            Rectangle rect = new Rectangle();
            rect.Stroke = currentbrush;
            rect.StrokeThickness = 1;
            rect.Height = (Math.Abs(e.GetPosition(this).Y) - Math.Abs(rectbeggining.Y));
            rect.Width = (rectbeggining.X - e.GetPosition(this).X);
            Canvas.SetLeft(rect, e.GetPosition(this).X);
            Canvas.SetTop(rect, Math.Abs(e.GetPosition(this).Y));
            cnvs.Children.Add(rect);
        }
        if(e.LeftButton == MouseButtonState.Released) drawing = false;
    }    

的Xaml

<Grid>    
    <Border Name="CanvasBorder" BorderBrush="Black" BorderThickness="2" Margin="8,8,207,9"/>    
    <Canvas HorizontalAlignment="Left" Height="972" Margin="10,10,0,0" VerticalAlignment="Top" Width="1493" MouseDown="Canvas_MouseDown" MouseMove="cnvs_MouseMove" Name="cnvs">    
        <Canvas.Background>    
            <SolidColorBrush Color="White" Opacity="0"/>    
        </Canvas.Background>    
    </Canvas>    
    <ComboBox Name="selectcolor" Margin="1510,10,10,945" SelectedItem="Black" SelectionChanged="selectcolor_SelectionChanged" SelectedIndex="7">    
        <ComboBox.ItemTemplate>    
            <DataTemplate>    
                <StackPanel Orientation="Horizontal">    
                    <Rectangle Fill="{Binding Name}" Width="16" Height="16" Margin="0,2,5,2" />    
                    <TextBlock Text="{Binding Name}" />    
                </StackPanel>    
            </DataTemplate>    
        </ComboBox.ItemTemplate>    
    </ComboBox>    
    <Button Content="Reset" HorizontalAlignment="Left" Margin="1510,939,0,0" VerticalAlignment="Top" Width="192" Click="Button_Click" Height="44"/>
    <RadioButton GroupName="selectedMode" Name="linemode" Content="Line" HorizontalAlignment="Left" Margin="1510,232,0,0" VerticalAlignment="Top" IsChecked="True"/>    
    <RadioButton GroupName="selectedMode" Name="fillmode" Content="Fill" HorizontalAlignment="Left" Margin="1510,247,0,0" VerticalAlignment="Top"/>
    <Label Content="Mode:" HorizontalAlignment="Left" Margin="1510,206,0,0" VerticalAlignment="Top"/>    
</Grid>    

1 个答案:

答案 0 :(得分:-1)

我正在为generalstaff的地图编辑器工作。您可以在线条或区域类型的地形之间进行选择,绘制并在完成笔划时对其进行处理。 除非我误解了你的目的,听起来就像你正在做的那样。

我基本上在画布上有一个墨迹。 它比那复杂得多。我将viewmodels绑定到一个itemscontrol,它将一个canvas作为itemspresenter,将模板数据绑定到一些terrain中。

我可以详细讨论这些事情。

我使用的是inkcanvas,因为它比直接在画布上绘制更加平滑。我开始使用这样的画布,但你得到了晃动的位..

strokeschanged事件用于判断墨迹上的笔划何时完成。 每个笔画都有一个styluspointcollection StylusPoints,您可以通过迭代来获得积分。

获得分数后,您可以构建多边形。 我通过模板化做到这一点,并将Polygon的Points属性绑定到viewmodel的Pointcollection。 多边形具有Fill属性,您可以将其设置或绑定到solidcolorbrush。 通过这种方式,您可以绘制任何您喜欢的形状,然后用一种颜色填充它。