4

以下 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>

有人愿意冒险解释我所看到的吗?还是这一切都在我的脑海里?

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

谢谢,

-斯科特

4

2 回答 2

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 引用放入您的项目中。

有了这个,您将在 XP 中看到您的应用程序,就像在 Vista 中一样。

于 2009-06-15T22:45:04.110 回答
0

嗯...您遇到焦点问题了吗?我加载了 Aero 主题,当 TextBox 具有焦点或鼠标悬停时,我看到了您的 TextBox inset。当您像这样添加第二个 TextBox 时,您可以清楚地看到这一点:

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

Aero 的默认样式使用 ControlTemplate 设置 TextBox 的边框以使用 ListBoxChrome,当控件具有焦点或鼠标悬停时,它看起来设置一些额外的属性。

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

于 2009-06-15T23:02:48.093 回答