C# 为什么cliptobunds=false不起作用?
我不想剪切文本块的文本。出于这个原因,我将viewBox.cliptobunds设置为false,但它不起作用 请告诉我为什么ClipToBounds=false在此代码中不起作用:C# 为什么cliptobunds=false不起作用?,c#,wpf,C#,Wpf,我不想剪切文本块的文本。出于这个原因,我将viewBox.cliptobunds设置为false,但它不起作用 请告诉我为什么ClipToBounds=false在此代码中不起作用: private void Btn1_Click(object sender, RoutedEventArgs e) { Button button = new Button(); button.Background = Brushes.Red; butt
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;
}
屏幕字幕:
下面的屏幕截图就是我想要的:
ClipToBounds
默认为false
。但是,由于某些元素执行布局的方式,剪裁仍然可能发生。基本上,WPF中的工作方式是设置ClipToBounds=true
将强制剪辑内容。将其设置为false
意味着WPF将根据度量约束确定应如何剪裁并排列矩形
如果查看中的ArrangeCore
和MeasureCore
方法,您将看到有相当多的逻辑决定是否应该剪辑某些内容。当然,覆盖FrameworkElement
的东西可以随意渲染,但通常它们会遵守基类建立的剪裁规则
在TextBlock
的情况下,如果文本大小受到限制,它肯定会剪辑超出其边界的文本。您只需在其上设置宽度
,或者将其放置为设置了宽度
的父级即可看到这一点
如果您真的需要文本在控件的边界之外进行渲染,您可能需要考虑编写自定义文本绘制元素之类的东西。 即使如此,只要您将其放置在其他要剪辑的对象中,它仍然会被其父对象剪辑。所以,你最终还是会陷入困境
您可以尝试将TextBlock
放置在按钮顶部而不是按钮内部,并设置其位置以使其位于正确的位置(可能通过将其绑定到某个对象)。这是可行的,但如果你需要做得太多,可能会很难管理
基本上,您正试图违反WPF的硬编码规则之一,因此您可能不会找到一种简单的方法来做到这一点。也许您需要重新评估您的设计,并确定这种行为对于您想要做的事情是否真的是必要的,或者您是否可以用另一种方式来实现它。多亏了elgonzo和Xavier 我意识到我不应该把画布放在viewbox中 通过改变,我的问题解决了 1-将viewbox与画布交换 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;
}
你能发布一个发生了什么的截图吗?可能与包装或宽度有关。抱歉,我没有足够的声誉发送图像。请将您的截图上载到众多免费图像宿主之一(例如),然后将截图链接添加到您的问题。感谢您的回复。屏幕截图已发送。
button.Width=70
。。。剪辑你的文字。请注意,为ViewBox设置ClipToBounds仅涉及对ViewBox父级(即堆栈面板)的剪裁,但不会影响对堆栈面板的任何父级(如按钮)的剪裁。。。