C# 为什么cliptobunds=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

我不想剪切文本块的文本。出于这个原因,我将viewBox.cliptobunds设置为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;
    }
屏幕字幕:

下面的屏幕截图就是我想要的:
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父级(即堆栈面板)的剪裁,但不会影响对堆栈面板的任何父级(如按钮)的剪裁。。。