2012-11-13 56 views
1

我對我的英語語法弱點表示歉意。我嘗試在WPF網格中繪製一個矩形。我畫了它,但是這個矩形在網格的右側和底部都沒有看到。我該怎麼辦?這是我的XAML和代碼。繪製的矩形未出現在wpf網格

< 窗口x:類= 「DrawCircle.MainWindow」 背後的代碼

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    Title="MainWindow" Height="350" Width="525" 
    MouseLeftButtonUp="window_MousLefteUp" MouseRightButtonUp="window_MouseRightButtonUp" 
    MouseMove="Grid_MouseMove" 
    MouseDown="Grid_MouseDown" > 

<Grid x:Name="window" Margin="0,0,0,0" Background="PaleGreen" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ClipToBounds="False"> 

    <Grid.RenderTransform> 
     <TransformGroup> 

      <ScaleTransform x:Name="scaleTransform1" ScaleX="0.5" ScaleY="0.5" /> 
      <TranslateTransform x:Name="translateTransform1" X="0" Y="0" /> 

     </TransformGroup> 
    </Grid.RenderTransform> 

</Grid> 

它是:

public partial class MainWindow : Window 
{ 

    bool cornerPointed = false; 
    Point corner1; 
    Rectangle myRectangle;   

    public MainWindow() 
    { 
     InitializeComponent(); 
     myRectangle = new Rectangle(); 
     myRectangle.HorizontalAlignment = HorizontalAlignment.Left; 
     myRectangle.VerticalAlignment = VerticalAlignment.Top; 
     myRectangle.Stroke = Brushes.Red; 
     window.Children.Add(myRectangle); 
    } 
    private void Grid_MouseDown(object sender, MouseButtonEventArgs e) 
    { 

     cornerPointed = true; 
     corner1 = new Point(e.GetPosition(this.window).X, e.GetPosition(this.window).Y); 
     myRectangle.Margin = new Thickness(corner1.X, corner1.Y, 0, 0); 
    } 

    private void Grid_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (cornerPointed == true) 
     { 
      Point corner2 = e.GetPosition(this.window); 
      myRectangle.Margin = new Thickness(System.Math.Min(corner1.X, corner2.X), 
               System.Math.Min(corner1.Y, corner2.Y), 
               0, 0); 
      myRectangle.Width = Math.Abs(e.GetPosition(this.window).X - corner1.X); 
      myRectangle.Height = Math.Abs(e.GetPosition(this.window).Y - corner1.Y); 
     } 
    } 

    private void window_MousLefteUp(object sender, MouseButtonEventArgs e) 
    { 

     cornerPointed = false; 
     myRectangle = new Rectangle(); 
     myRectangle.HorizontalAlignment = HorizontalAlignment.Left; 
     myRectangle.VerticalAlignment = VerticalAlignment.Top; 
     myRectangle.Stroke = Brushes.Red; 
     window.Children.Add(myRectangle); 

    } 
} 
+0

它的硬頂告訴你這個職位要求什麼,但上運行你的例子,我可以看到紅色矩形得到正確繪製的網格內,直到你遇到電網邊緣,其中右側和底部兩側唐不會畫出來,這是你想要阻止的嗎? – Andy

回答

0

你問爲什麼綠色網格不填整個窗戶?如果是這樣,那是因爲這條線,它可以擴展網格的寬度和高度下降了50%:

<ScaleTransform x:Name="scaleTransform1" ScaleX="0.5" ScaleY="0.5" /> 

如果這是沒有問題的,請澄清的問題是什麼。

+0

我放了ScaleTransform,因爲我稍後會用它來放大和縮小。 –

+0

我會將一些UIElements放入網格中加上矩形,形狀和文字,以便在網格中播放註釋角色。我放了ScaleTransform,因爲我稍後會用它來放大和縮小窗口。所以,我的問題是在具有縮放功能的網格中自由地繪製一些註釋。 –

+0

OK,目前看起來工作正常。網格放大到窗口寬度的一半和高度的一半。你可以在裏面畫紅色的矩形。哪部分工作不正常? –

0

Scaletransform縮小了您的綠色網格。由於您直接在綠色網格上繪製紅色矩形,因此紅色矩形不能超出綠色。

如果你想擁有綠色的是體積小,但仍然有紅色的到處走,那麼你可以只使用另一電網這樣的:

<Grid x:Name="window"> 
    <Grid Background="PaleGreen"> 
     <Grid.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform x:Name="scaleTransform1" ScaleX="0.5" ScaleY="0.5" /> 
      <TranslateTransform x:Name="translateTransform1" X="0" Y="0" /> 
     </TransformGroup> 
     </Grid.RenderTransform> 
    </Grid> 
    </Grid> 

編輯: 這是一個使用滑塊來一個另外的實例展現「縮放」效果。移動滑塊時,紅色矩形也會放大。

<DockPanel LastChildFill="True"> 
    <Slider x:Name="sldZoom" DockPanel.Dock="Top" Orientation="Horizontal" Minimum="0" Maximum="1" Value="1"/> 
    <Grid Background="PaleGreen" x:Name="window"> 
     <Grid.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform x:Name="scaleTransform1" 
          ScaleX="{Binding ElementName=sldZoom, Path=Value, Mode=OneWay}" 
          ScaleY="{Binding ElementName=sldZoom, Path=Value, Mode=OneWay}" /> 
     </TransformGroup> 
     </Grid.RenderTransform> 
    </Grid> 
    </DockPanel> 

EDIT2: ,如果你願意,你也可以改變滑塊(或任何你使用綁定屬性)的規模。例如..而不是使用0-1的比例,你可以使用0-10的比例。這意味着,當您將其設置爲10時,您將獲得10倍變焦效果。

如果您想禁用縮小到您無法寫入的空白處,請將基準比例設置爲1.下面是一個滑塊,您可以將其放入上述示例中, 10倍的規模。這將禁止用戶縮小到他們不可寫區域的位置。 (你可以使用數字來獲得你喜歡的任何設置)。

<Slider x:Name="sldZoom" DockPanel.Dock="Top" Orientation="Horizontal" Minimum="1" Maximum="10" Value="2"/> 
+0

謝謝你的回答。我想放大/縮小綠色網格。我想放大矩形,我想將矩形放在每個我想要的位置。當我放大時,我沒有任何問題;但是當我縮小時,我不能將矩形放在窗口的右側和底部。 –

+0

沒問題。所有你需要做的就是將你的scaleX和scaleY綁定到一個屬性。然後,當您修改您的財產時,綠色記錄將縮放(縮放)以匹配。紅色的矩形也會縮放。查看我編輯的答案以獲得一個工作示例。 –

+0

我找到了答案。請參閱http://drwpf.com/blog/2007/12/28/cliptoboundsmaybe/。現在我想重寫GetLayoutClip。如果我這樣做,我想我會解決問題。 –