我不想剪切文本块的文本。出于这个原因,我将viewBox.ClipToBounds设置为false,但它不起作用。
请告诉我为什么ClipToBounds=false不能在下面的代码中工作:
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:

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

发布于 2015-06-21 23:18:42
默认情况下,ClipToBounds为false。但是,由于某些元素执行布局的方式,裁剪仍然可能发生。基本上,在WPF中的工作方式是,设置ClipToBounds = true将强制裁剪。将其设置为false意味着WPF将根据度量约束和排列矩形来确定裁剪对象的方式。
如果您查看FrameworkElement中的ArrangeCore和MeasureCore方法,您会发现其中有相当多的逻辑来决定是否应该裁剪某些内容。当然,覆盖FrameworkElement的东西可以随意渲染,但通常它们会遵守基类建立的裁剪规则。
在TextBlock的情况下,如果它的大小受到限制,它肯定会剪切超出其边界的文本。您只需在其上设置一个Width,或者将其放置在一个设置了Width的父项上,就可以看到这一点。
如果您确实需要在控件边界之外呈现文本,则可能必须考虑编写自定义文本呈现元素之类的操作。即使这样,一旦你把它放在其他被剪辑的东西中,它仍然会被它的父级剪裁。所以,你仍然有可能被卡住。
您可以尝试将TextBlock放在按钮的顶部,而不是放在按钮的内部,并设置其位置以使其位于正确的位置(可能是通过将其绑定到某个东西)。这是可行的,但是如果你需要做太多的话,可能会变得很难管理。
基本上,您正在尝试违反WPF的硬编码规则之一,因此您可能找不到一种简单的方法来做到这一点。也许您可能想重新评估您的设计,并确定此行为对于您想要做的事情是否真的是必要的,或者您是否可以以不同的方式进行。
发布于 2015-06-22 02:41:19
多亏了埃尔贡佐和泽维尔。
我意识到我不应该把画布放在viewbox中。
通过2次改变我的问题解决了。
1-将viewbox与canvas互换。
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;
}https://stackoverflow.com/questions/30964863
复制相似问题