none
如何解决WPF作成的不规则窗口的锯齿问题 RRS feed

  • 问题

  • 在开发过程中经常发现WPF作成的窗口(或控件,如:ListBox)经常会显示出锯齿,特别是边缘位置。 经过试验,即使创建个最基本的窗口(无任何特效),如果加上Menu或Tab时,也会出现类似的状况。 很郁闷,求高手帮忙。
    2011年3月16日 8:45

答案

  • ok, 我大概看了下你的代码,你去掉了本身Window的Chrome 边框,做了一个自定义的外框和内容。所以你的例子并不是简单的一个控件在Window里面,我们也很难说重现出你所说的简单的现象。当然,你可以试试把那个 bg_grid 的 Background 就是那个ImageBrush去掉, 然后测试下。 我发现你使用了一个ImageBrush, 这个会把你的 bg.jpg 这张非矢量图片作为背景,然后你又使用了缩放变换,所以就很难保证非矢量图片的质量了。

     

    然后,我这里找到篇KB文章,也许对你有点帮助:  Guidelines for troubleshooting graphic issues in WPF applications

    还有,你可以先把图片上传到 微软的 SkyDrive.com 上(用你的Live ID登陆,把图片放进一个共开的目录),然后你可以修改帖子的HTML,假如图片,或者直接把图片链接放在这,我们也可以看到。当然这个地方你也可以把你的测试,能够重现的例子也放上来。

     

    最后,如果你实在无法确认这个是有与代码或者硬件 还是WPF产品本身造成的,你可以到 https://connect.microsoft.com/wpf 去提交一个问题反馈。


    Best day, Best life
    2011年3月24日 2:09
  • 感谢各位的帮助,这个问题可以告一段落了(虽然没有完全解决)。
    暂且定性为所使用平台太差吧
    ■主机配置(仅供参考)
    -E5300 双核
    -G41主板(板载显卡)
    -4G内存
    • 已标记为答案 YinRuifeng 2011年3月29日 2:43
    2011年3月29日 2:42

全部回复

  • 首先,你能提供一下你开发环境的信息么,比如操作系统,显卡。这些都是有影响了。

    对于你的问题,你可以参考我在这个帖子中提供的链接:

    http://social.microsoft.com/Forums/zh-CN/wpfzhchs/thread/839647a3-eec5-4202-8814-e471fd2f3c67

    另一方面,根据你说的“特别是边缘位置”,你可以尝试用Border包一下你的控件,然后设置Background和Thickness属性。

    如果你的锯齿现象严重到你无法忍受,你可以分享一下你的环境和简单的例子,让我能重现你的问题。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月16日 10:43
    版主
  • 首先,你能提供一下你开发环境的信息么,比如操作系统,显卡。这些都是有影响了。

    对于你的问题,你可以参考我在这个帖子中提供的链接:

    http://social.microsoft.com/Forums/zh-CN/wpfzhchs/thread/839647a3-eec5-4202-8814-e471fd2f3c67

    另一方面,根据你说的“特别是边缘位置”,你可以尝试用Border包一下你的控件,然后设置Background和Thickness属性。

    如果你的锯齿现象严重到你无法忍受,你可以分享一下你的环境和简单的例子,让我能重现你的问题。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    我是使用了Border包含了我的控件,但是问题依旧存在。 也曾试过使用像素对齐的方式,效果也不明显。是不是跟我所使用的PC有关? 我在公司用的PC系统是XP,集成显卡。。。 还有,我有截图,不知道怎么能发给你?
    2011年3月18日 2:11
  • 我觉得你可以找台性能好点的机器,关键是显卡nice一点的去试试你这个程序,可能会好很多。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月18日 7:39
    版主
  • 我觉得你可以找台性能好点的机器,关键是显卡nice一点的去试试你这个程序,可能会好很多。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    是呀,用独显的机器肯定会好很多,但是我比较困惑的是难道WPF就只能在性能好的机器上正常表示?
    难道WPF对硬件配置有要求?

    还有就是为什么从第三方Download的Demo/Sample都没有问题?(如:RadControl)
    2011年3月18日 8:44
  • 边缘的锯齿应该可以用alpha渐变模糊掉哦  您考虑下?


    入了ipad,最近用ipad上论坛
    2011年3月18日 8:56
  • 边缘的锯齿应该可以用alpha渐变模糊掉哦  您考虑下?


    入了ipad,最近用ipad上论坛
    试了下,但是运行时内存会多占用很多,整体性能下降。。。
    2011年3月20日 15:48
  • 补充一点,在现有的机器上跑MSDN中的所有实例程序都没发现边缘出现锯齿的问题。
    从Code上也没看出什么特别之处,但是一到自己作成时却问题依旧。
    期待大侠们给出帮助意见。
    2011年3月22日 0:55
  • 哎,既然MSDN文档上的代码你跑起来正常,你自己的代码跑起来不正常,那么你为什么不早点share你的代码呢???

    版主早就跟你说“如果你的锯齿现象严重到你无法忍受,你可以分享一下你的环境和简单的例子,让我能重现你的问题。”, 你完全无视,然后让大家在这里一顿乱猜,浪费时间啊,

    对于你这个问题,我觉得你应该读一本书,叫做 如何提问题, 问题描述清楚了,大家给你的回复才是解决方案,否则,更像一个猜谜游戏。

    不清楚还有没有人愿意做你的帖子。


    Stay hungry, stay foolish
    2011年3月22日 13:42
  • 这个是由你的特殊的硬件环境决定的,不可能会是所有人都会这样。所以不要太拘泥于这个问题,不过WPF的绘制特性可以通过 RenderOptions.EdgeMode 这个附加属性来改变。
    Best day, Best life
    2011年3月22日 14:38
  • 哎,既然MSDN文档上的代码你跑起来正常,你自己的代码跑起来不正常,那么你为什么不早点share你的代码呢???

    版主早就跟你说“如果你的锯齿现象严重到你无法忍受,你可以分享一下你的环境和简单的例子,让我能重现你的问题。”, 你完全无视,然后让大家在这里一顿乱猜,浪费时间啊,

    对于你这个问题,我觉得你应该读一本书,叫做 如何提问题, 问题描述清楚了,大家给你的回复才是解决方案,否则,更像一个猜谜游戏。

    不清楚还有没有人愿意做你的帖子。


    Stay hungry, stay foolish

    我已经问了怎么上传图片好让给大家知道现象发生时的状况了,但没人回复。

    关于代码我觉得由于太简单,仅仅是创建基本窗口,然后增加个TabControl而已,这么简单也有必要提供?

    不知道是我没说清楚还是您看不懂!

    2011年3月22日 23:09
  • 我觉得是你没说清楚。

    根据你的描述,跑MSDN上的例子完全没问题,但是跑你自己写的代码就有问题了,那么问题很明显出在你自己的代码那里,你在这边问“

    如何解决WPF作成的不规则窗口的锯齿问题

    神仙能知道如何帮助你?WPF能抗锯齿的方法大家全都给你了,依然无效,结果最后才发现是你自己硬件+错误的代码问题。

    你这样提问就相当于我前些日子遇到一个问题,那人问我,WPF如何设置ComboBox的SelectedIndex,我说ComboBox。SelectedIndex = 。。, 他说,还有其他方法么?

    我说,用Item,然后她说还有其他方法么? 一堆人罗列各种方法,结果那人说都不行,他这边ComboBox的选中的Item总是设置不上。大家说你提供代码吧,那人说 及其的简单,就是一个ComboBox,然后加入Item。

    就在大家觉得这个问题会是个Bug的时候,神奇的时候出现了,这个仁兄说,原来我先选择了Item,然后加入了Item,在我选择的时候,这个Item还不在ComboBox里面,这个时候,大家笑了。

    虽然这个问题跟你的不一样,但是你要明白你给我们提供的信息是: MSDN代码好用,你自己的代码不好用,大家的硬件好用,你的硬件不好用,所以,想要解决你的问题就必须要这样做:

    你给我们提供你的环境+代码,我们重现你的问题,然后让版主会通过各种方式去测试你的问题,找到你的问题原因,这是微软专业support的流程,经过你提供的环境信息+重现代码,微软的工作人员就可以明确的告诉你这个问题是Bug,还是你某个选项设置问题,或者你的代码写的有问题,或者 在这个环境下WPF是不能开启这个功能的。

    这才是你能得到正确答案的途径。

    你来提问的目的只有一个,那就是解决自己的问题!

    大家来回帖子的目的也只有一个,那就是帮助你解决问题!

    没有一个人是针对某个人来的,所以,你不提供详尽的信息,大家如何去解决你的问题,我现在在Window7的环境下测试锯齿,无论我做出了多大的努力,依然无法给你提供任何帮助的信息。

    我在XP下,用我自己的代码,无论如何努力,都不能给你提供有用的信息,因为我不明确你代码的情况。

    这里是官方论坛,里面有微软官方的技术人员在给你解答问题,我觉得你不配合他们是对资源的浪费。

    我写了这么对希望你能自己看一看,对你以后提问会有所帮助,因为这样你能得到更好更准确的答案,也能学到更多的知识。

    谢谢你的理解,还有,记得关帖子,这样对给你做support的人员是一种鼓励。


    Stay hungry, stay foolish
    2011年3月23日 3:52
  • 我觉得你可以尝试一下Jarrey提供的方法,尝试以后告诉我们结果


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月23日 5:12
    版主
  • 按照Helper.WPF推荐的做法,把我的环境+代码说明一下,希望你能重现。
    ■系统环境
    Window XP(日文版)
    ■硬件环境
    显卡:INTEL G41板载显卡
    CPU:E5300
    内存:4G DDR3
    ■现象描述
    1.运行时,主窗口上边缘有锯齿现象。
    2.侧边缘在窗口缩放后有凸凹现象。
    ■程序主窗口代码
    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:me="clr-namespace:iTouch_MVVM.ViewModels"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" xmlns:Views="clr-namespace:iTouch_MVVM.Views"
    Views:ViewProperyies.WindowMode="
    {Binding WindowMode}"
    x:Class="iTouch_MVVM.Views.MainView" WindowStyle="None" AllowsTransparency="True" Background="Transparent" SnapsToDevicePixels="True" WindowStartupLocation="CenterScreen" ResizeMode="NoResize"> <Window.Resources> <Storyboard x:Key="iTouchStoryboard"> <DoubleAnimation Storyboard.TargetName="WindowWidth" Storyboard.TargetProperty="Width" Duration="0:0:0.5" From="830" To="350" /> </Storyboard> <Storyboard x:Key="iPadStoryboard"> <DoubleAnimation Storyboard.TargetName="WindowWidth" Storyboard.TargetProperty="Width" Duration="0:0:0.5" From="350" To="830" /> </Storyboard> </Window.Resources> <Border Background="Black" BorderThickness="0" CornerRadius="10" Name="WindowWidth" Height="680" Width="350" SnapsToDevicePixels="True" ClipToBounds="True"> <Grid Width="{Binding ElementName=WindowWidth, Path=Width}" Name="Container" ClipToBounds="True" SnapsToDevicePixels="True"> <Grid.RowDefinitions> <RowDefinition Height="100" /> <RowDefinition Height="480" /> <RowDefinition Height="100" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="15" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="15" /> </Grid.ColumnDefinitions> <Grid x:Name="bg_grid" Grid.Column="1" Grid.Row="1" ClipToBounds="True" SnapsToDevicePixels="True"> <Grid.Background> <ImageBrush ImageSource="/iTouch_MVVM;component/images/bg.jpg"/> </Grid.Background> <Grid.RenderTransform> <ScaleTransform x:Name="DesktopScale" CenterX="160" CenterY="240" /> </Grid.RenderTransform> <Views:ShortCutView x:Name="Desktop" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0" /> </Grid> <Label Content="PowerDrvCodeGenerator" x:Name="label1" Grid.Row="0" SnapsToDevicePixels="True" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontWeight="Bold" MouseLeftButtonDown="label_MouseLeftButtonDn" Grid.ColumnSpan="3" Style="{StaticResource AppTitleFont}" /> <Button Name="HomeButton" Style="{StaticResource HomeButton}" Focusable="False" Grid.Column="1" Grid.Row="2" Command="{Binding HomeCommand}" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="True" /> </Grid> </Border> </Window>
    • 已编辑 YinRuifeng 2011年3月23日 8:45 上传后格式混乱
    2011年3月23日 8:43
  • 这个是由你的特殊的硬件环境决定的,不可能会是所有人都会这样。所以不要太拘泥于这个问题,不过WPF的绘制特性可以通过 RenderOptions.EdgeMode 这个附加属性来改变。
    Best day, Best life


    按照Jerry建议的方法,设置了主窗口的Border后,主窗口的上边缘还是有同样的问题。
    2011年3月23日 8:48
  • 补充一下,在更换了XP的桌面主题后,现象也有变化。

    ■经典风格
    锯齿较严重

    ■XP风格
    能稍微强点
    2011年3月23日 9:02
  • 你显卡版本是什么?

    你先更新一下显卡驱动看看效果,因为显卡有反锯齿的功能,你看看。

    我这边给你再看看你的代码。


    Stay hungry, stay foolish
    2011年3月23日 11:42
  • 你显卡版本是什么?

    你先更新一下显卡驱动看看效果,因为显卡有反锯齿的功能,你看看。

    我这边给你再看看你的代码。


    Stay hungry, stay foolish

    显卡是主板上集成的(因为是公司的PC,所以显卡差点)。

    我们个人是没有权限安装软件的,所以没法更新显卡驱动。

     

    不过我不解的是为什么MSDN的所有例子运行时都没有问题呢?我担心的是有什么需要注意的地方被我忽略了。

     

    PS:代码贴的有点乱,不好意思(因为在公司,回复时无法调格式,不知为什么)

    2011年3月23日 12:05
  • ok, 我大概看了下你的代码,你去掉了本身Window的Chrome 边框,做了一个自定义的外框和内容。所以你的例子并不是简单的一个控件在Window里面,我们也很难说重现出你所说的简单的现象。当然,你可以试试把那个 bg_grid 的 Background 就是那个ImageBrush去掉, 然后测试下。 我发现你使用了一个ImageBrush, 这个会把你的 bg.jpg 这张非矢量图片作为背景,然后你又使用了缩放变换,所以就很难保证非矢量图片的质量了。

     

    然后,我这里找到篇KB文章,也许对你有点帮助:  Guidelines for troubleshooting graphic issues in WPF applications

    还有,你可以先把图片上传到 微软的 SkyDrive.com 上(用你的Live ID登陆,把图片放进一个共开的目录),然后你可以修改帖子的HTML,假如图片,或者直接把图片链接放在这,我们也可以看到。当然这个地方你也可以把你的测试,能够重现的例子也放上来。

     

    最后,如果你实在无法确认这个是有与代码或者硬件 还是WPF产品本身造成的,你可以到 https://connect.microsoft.com/wpf 去提交一个问题反馈。


    Best day, Best life
    2011年3月24日 2:09
  • 问题发生时的截图,请大家看看。

    http://cid-5c8533b423e545ab.photos.live.com/browse.aspx/MyPictures

    2011年3月24日 15:12
  • 这个现象我怎么看都不像是锯齿现象啊,是不是你图片应用了rendertransform或者layouttransform引起的?试一试换个图片看看好点没。
    Stay hungry, stay foolish
    2011年3月25日 6:56
  • 这个现象我怎么看都不像是锯齿现象啊,是不是你图片应用了rendertransform或者layouttransform引起的?试一试换个图片看看好点没。
    Stay hungry, stay foolish
    兄弟,这可不是图片的边缘啊,图片是Border的上边缘啊(就是我的不规则窗口的上边缘)
    2011年3月25日 14:54
  • 唉, 这个问题实在在论坛上帮不了你了,我也去查了微软的问题列表,和咨询了下微软的人,你的这个问题很特殊,你这个问题你只有去报个bug了,https://connect.microsoft.com/wpf   不过即使报个bug   微软也是会要求提供重现的项目的,这是最低的要求。我相信你也是做开发的,受到一个bug反馈,要求详细的信息资料这种心情 你应该可以理解。
    Best day, Best life
    2011年3月26日 3:55
  • 还有,你真的确信这个是WPF本身造成的?  你能够保证在所有电脑上都这样吗? 如果不是,我想你还是尽早想想联系其他途径,比如硬件商,或者其他设备商,不能在一棵树上吊死
    Best day, Best life
    2011年3月26日 3:57
  • 感谢各位的帮助,这个问题可以告一段落了(虽然没有完全解决)。
    暂且定性为所使用平台太差吧
    ■主机配置(仅供参考)
    -E5300 双核
    -G41主板(板载显卡)
    -4G内存
    • 已标记为答案 YinRuifeng 2011年3月29日 2:43
    2011年3月29日 2:42
  • 其实配置也不错了,只是显卡可能性能上会有些损失,谁让WPF对显卡有要求呢,哎!
    Best day, Best life
    2011年3月29日 2:44