WPF文本框&边界 - 好奇的大小调整行为

时间:2009-06-15 19:00:19

标签: wpf textbox resize border

以下XAML会在文本框周围生成一个奇怪行为的窗口:

<Window x:Class="WpfSandbox.CuriousExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CuriousExample" Height="300" Width="300">
    <DockPanel Margin="15">
        <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
    </DockPanel>
</Window>

至少在我的有限测试期间,会发生的事情是文本框呈现内嵌边框图案(上/左是黑色,右/下是灰色)。但是,当您调整大小除原始位置以外的任何位置时,整个文本框边框将变为黑色。每当您将窗口返回到窗体首次加载时的屏幕像素的确切数量时,它就会再次插入。

我猜这不是像素捕捉,因为我可以使用此代码轻松纠正问题:

<Window x:Class="WpfSandbox.CuriousExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CuriousExample" Height="300" Width="300">
    <DockPanel Margin="15">
        <Border BorderThickness="1" BorderBrush="#FF000000">
            <TextBox BorderThickness="0" ></TextBox>
        </Border>
    </DockPanel>
</Window>

任何人都想关注我所看到的解释?或者这一切都在我脑海里?

就像我说的,上面的解决方法可以解决这个问题 - 只是想了解这里发生了什么。

谢谢,

-Scott

2 个答案:

答案 0 :(得分:0)

您可以强制应用程序使用vista主题(aero)

打开你的app.xaml并输入如下内容:

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

不要忘记将PresentationFramework.Aero引用放入您的项目中。

有了这个,你就可以像在Vista中一样在XP中使用。

答案 1 :(得分:0)

嗯......你是否遇到焦点问题?我加载了Aero主题,当TextBox具有焦点或被moused-over时,我看到你的TextBox插入。当您添加第二个TextBox时,您可以非常清楚地看到这一点:

<DockPanel Margin="15">
    <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
    <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
</DockPanel>

Aero的默认样式使用ControlTemplate,它将TextBox的边框设置为使用ListBoxChrome,它在控件具有Focus或被鼠标悬停时设置一些额外的属性。

或者,Luna主题的默认样式将包含Border的BorderBrush直接绑定到TemplateBinding,这意味着它始终受到尊重(以及为什么它在XP / Luna中工作,而不是在2008或Vista中)。