none
关于WPF中RichTextBox粘贴图片的问题 RRS feed

  • 问题

  • 我用截图工具截取一张图片后,在RichTexBox中粘贴,会出现图像,但图像质量明显降低,我该如何保证图像质量不损失?

    另外,粘贴后图片元素就会占一行(无论多小的图片),我想让它放在当前Paragraph的末尾,不知道该怎么做。。

     

    2011年5月13日 1:29

答案

  • 第一个问题, 图像质量是由你用的截屏幕的软件决定的,我测试使用 Print Screen 按键,它的效果还是和屏幕显示效果一致的。所以你需要调整的是你的屏幕截图的软件设置。但是还有一点要注意,WPF4图像质量下降,你则需要尝试手动指定 RenderOptions.BitmapScalingMode="HighQuality" 这个属性。

    第二个问题,在WPF Document中有两个概念,Block(块)和Inline,每个Block会分行显示,而Inline是在同一行显示的。所以你要将粘贴的图片加入当前Paragraph的末尾,你就需要一个InlineUIContainer 去包一个Image组件,然后Add到Paragraph中。

    下面是一个简单的例子:

      <Grid>    
        <RichTextBox x:Name="rtb">
          <RichTextBox.CommandBindings>
            <CommandBinding Command="Paste" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/>
          </RichTextBox.CommandBindings>
          <FlowDocument>
            <Paragraph x:Name="p1">
              Insert the image end of this line.
            </Paragraph>
          </FlowDocument>
        </RichTextBox>
      </Grid>
    

     

    C#:

      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
          e.CanExecute = true;
        }
    
        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
          if (Clipboard.ContainsImage())
          {
            p1.Inlines.Add(new InlineUIContainer(new Image() { Source = Clipboard.GetImage(), Stretch=Stretch.None }));
          }
        }
      }
    

     

    Sincerely,


    Bob Bao [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年5月13日 10:21
    版主

全部回复

  • 第一个问题, 图像质量是由你用的截屏幕的软件决定的,我测试使用 Print Screen 按键,它的效果还是和屏幕显示效果一致的。所以你需要调整的是你的屏幕截图的软件设置。但是还有一点要注意,WPF4图像质量下降,你则需要尝试手动指定 RenderOptions.BitmapScalingMode="HighQuality" 这个属性。

    第二个问题,在WPF Document中有两个概念,Block(块)和Inline,每个Block会分行显示,而Inline是在同一行显示的。所以你要将粘贴的图片加入当前Paragraph的末尾,你就需要一个InlineUIContainer 去包一个Image组件,然后Add到Paragraph中。

    下面是一个简单的例子:

      <Grid>    
        <RichTextBox x:Name="rtb">
          <RichTextBox.CommandBindings>
            <CommandBinding Command="Paste" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/>
          </RichTextBox.CommandBindings>
          <FlowDocument>
            <Paragraph x:Name="p1">
              Insert the image end of this line.
            </Paragraph>
          </FlowDocument>
        </RichTextBox>
      </Grid>
    

     

    C#:

      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
          e.CanExecute = true;
        }
    
        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
          if (Clipboard.ContainsImage())
          {
            p1.Inlines.Add(new InlineUIContainer(new Image() { Source = Clipboard.GetImage(), Stretch=Stretch.None }));
          }
        }
      }
    

     

    Sincerely,


    Bob Bao [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年5月13日 10:21
    版主
  • 感谢版主回复。

    您提供的解决方案可以解决问题。

    但在这过程中我又遇到了一个问题,就是在FlowDocument中,拉动滚动条的时候,里面的内容会模糊一下。包括图片和文字,停止滚动后恢复清晰。在XP下测试过不会有此问题,但字体普遍较糊,图片无异常。请问这个问题是如何引起的?又该如何解决?

    对了,字体是用雅黑的

    2011年5月15日 11:58
  • 你好,

    关于字体模糊的问题,这里我个人有两个解释,第一个是,如果是WPF 3.5或3.0的情况的话,WPF产品在字形处理上过分地优化了,导致字形反而变得模糊,这个在官方已经承认,并且在新版本WPF 4中加以了修正。所以,第二,你如果用的是WPF 4,如果还有字形模糊,就我个人使用经验来看,目前在动态地显示情况下,WPF 4已经作了很大的改善。

    不过你可以注意下在WPF 4中引入的这个新的附加属性:TextOptions.TextRenderingMode 是专门来设置字形渲染模式的。而且从官方的博客中我们也可以看到,WPF 4对于亚洲语言作了很大的改进: http://blogs.msdn.com/b/text/archive/2009/08/24/wpf-4-0-text-stack-improvements.aspx

    所以,综上所述。一方面,尝试在WPF 4下开发,另一方面,尽可能使用附加属性进行优化。

    Sincerely,


    Bob Bao [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年5月16日 3:06
    版主