我不想剪切文本块的文本。出于这个原因,我将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:
下面的截图是我想要的。 :
答案 0 :(得分:4)
ClipToBounds
为false
。但是,由于某些元素执行布局的方式,剪切仍然可能发生。基本上WPF中的工作方式是设置ClipToBounds = true
会强制剪切内容。将其设置为false
意味着WPF根据度量约束确定事物应如何剪切并安排rects。
如果您查看FrameworkElement
中的ArrangeCore
和MeasureCore
方法,您会发现确定某些内容是否应该剪辑有相当多的逻辑。当然,覆盖FrameworkElement
的内容可以随意呈现,但通常他们会遵守基类建立的裁剪规则。
在TextBlock
的情况下,如果文本的大小受到约束,它肯定会剪切超出其边界的文本。您只需在其上设置Width
,或者将其设置为设置了Width
的父级即可看到此内容。
如果您确实需要在控件的边界之外渲染文本,则可能需要考虑编写自定义文本呈现元素之类的内容。 即使这样,只要你把它放在剪辑的其他东西上,它仍然会被它的父母剪掉。所以,你最终还是会卡住。
您可以尝试将TextBlock
放在按钮顶部而不是放在按钮内部,并设置其位置以使其位于正确的位置(可能通过将其绑定到某个位置)。这可行,但如果你需要做太多,可能会很难管理。
基本上,你试图违反WPF的一个硬编码规则,所以你可能不会找到一个简单的方法来做到这一点。也许你可能想要重新评估你的设计,并确定这种行为是否真的对你想要做的事情是必要的,或者你是否可以用不同的方式去做。
答案 1 :(得分: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;
}