为什么ClipToBounds = false不起作用?

时间:2015-06-21 13:10:05

标签: c# wpf

我不想剪切文本块的文本。出于这个原因,我将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:

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

2 个答案:

答案 0 :(得分:4)

默认情况下,

ClipToBoundsfalse。但是,由于某些元素执行布局的方式,剪切仍然可能发生。基本上WPF中的工作方式是设置ClipToBounds = true会强制剪切内容。将其设置为false意味着WPF根据度量约束确定事物应如何剪切并安排rects。

如果您查看FrameworkElement中的ArrangeCoreMeasureCore方法,您会发现确定某些内容是否应该剪辑有相当多的逻辑。当然,覆盖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;

    }