2015-06-21 79 views
3

我不想剪切文本块的文本。出于这个原因,我将viewBox.ClipToBounds设置为false,但它不起作用。为什么ClipToBounds = false不起作用?

请告诉我为什么ClipToBounds =假在此代码的工作:

private void Btn1_Click(object sender, RoutedEventArgs e) 
    { 
      Button button = new Button(); button.Background = Brushes.Red; 
      button.Width = 70; button.Height = 20; 
      Canvas.SetLeft(button, 100); Canvas.SetTop(button, 120); 
      button.Padding = new Thickness(1); 

      StackPanel stackPanel = new StackPanel(); 

      Viewbox viewBox = new Viewbox(); 
      viewBox.ClipToBounds = false; 

      Canvas canvas = new Canvas(); 
      canvas.Width = button.Width; canvas.Height = button.Height; 

      TextBlock textBlock = new TextBlock(); 
      textBlock.Text = "this is a test"; 
      textBlock.FontSize = 15; 
      textBlock.FontFamily = new FontFamily("Arial"); 
      textBlock.TextWrapping = TextWrapping.NoWrap; 
      textBlock.Foreground = Brushes.Green; 
      textBlock.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
      textBlock.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
      viewBox.Height = 20; 
      textBlock.IsHitTestVisible = false; 

      stackPanel.Children.Add(viewBox); 
      viewBox.Child = canvas; 
      canvas.Children.Add(textBlock); 
      button.Content = stackPanel; 

      Canvas MainCanvas = new Canvas(); 
      MainCanvas.Children.Add(button); 
      this.Content = MainCanvas; 
    } 

Screenhsot:

下面的截图是我想要的。 :

+0

你能后的会发生什么截图?可能与包装或宽度有关。 – Cyral

+0

对不起,我没有足够的发送图像的声望。 – mitli

+0

将您的屏幕截图上传到许多免费图像主机(例如[imgur.com](http://www.imgur.com))中,然后将截图的链接添加到您的问题中。 – elgonzo

回答

4

ClipToBounds默认为false。然而,由于某些元素执行布局的方式,裁剪仍然可能发生。基本上,WPF中的工作方式是设置ClipToBounds = true将强制剪辑。将其设置为false意味着WPF根据度量约束确定事件如何剪辑并排列矩形。

如果你看ArrangeCoreMeasureCore方法FrameworkElement,你会看到有相当多的逻辑确定是否应该剪辑。当然,覆盖FrameworkElement的东西可以随意渲染,但他们通常会遵守由基类建立的裁剪规则。

TextBlock的情况下,如果它的大小受到限制,它肯定会剪切超出边界的文本。你可以通过简单地设置一个Width来看到它,或者将它放置在其上设置了Width的父级。

如果您确实需要在控件边界之外渲染文本,则可能需要考虑类似于编写自定义文本渲染元素的内容。 即使如此,只要将其放置在其他剪辑中,它仍然会被其父项剪辑。所以,你仍然可能最终陷入困境。

您可以尝试将TextBlock放置在按钮的上方而不是其内部,并设置其位置以将其放在正确的位置(可能通过绑定到某个位置)。这可行,但如果你需要做太多,可能会难以管理。

基本上,你试图违背WPF的硬编码规则之一,所以你可能不会找到一个简单的方法来做到这一点。也许你可能想要重新评估你的设计,并确定这种行为对于你想要做什么来说确实是必要的,或者如果你可以用不同的方式去做。

2

感谢elgonzo和Xavier。

我意识到我不应该把画布放在视图框中。

通过2更改我的问题解决。

1 - 用画布交换视图框。

2 - 删除canvas.with = ...

这是正确的代码:

private void Btn1_Click(object sender, RoutedEventArgs e) 
    { 
     Button button = new Button(); button.Background = Brushes.Red; 
     button.Width = 70; button.Height = 20; 
     Canvas.SetLeft(button, 100); Canvas.SetTop(button, 120); 
     button.Padding = new Thickness(1); 

     StackPanel stackPanel = new StackPanel(); 

     Viewbox viewBox = new Viewbox(); 
     viewBox.ClipToBounds = false; 

     Canvas canvas = new Canvas(); 
     // canvas.Width = button.Width; canvas.Height = button.Height; 

     TextBlock textBlock = new TextBlock(); 
     textBlock.Text = "this is a test"; 
     textBlock.FontSize = 15; 
     textBlock.FontFamily = new FontFamily("Arial"); 
     textBlock.TextWrapping = TextWrapping.NoWrap; 
     textBlock.Foreground = Brushes.Green; 
     textBlock.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
     textBlock.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
     viewBox.Height = 20; 
     textBlock.IsHitTestVisible = false; 

     stackPanel.Children.Add(canvas); 
     viewBox.Child = textBlock; 
     canvas.Children.Add(viewBox); 
     button.Content = stackPanel; 

     Canvas MainCanvas = new Canvas(); 
     MainCanvas.Children.Add(button); 
     this.Content = MainCanvas; 

    } 
相关问题