none
[求鉴定]这是BUG还是我代码的问题 RRS feed

  • 问题

  • 我使用AdornerLayer来实现拖放的效果,一切都正常,然后

    我在Window中使用了Microsoft.Windows.Shell中的WindowChrome以改变标题栏的样式

       <Style TargetType="{x:Type me:WinMain}">
          <Setter Property="shell:WindowChrome.WindowChrome">
            <Setter.Value>
              <shell:WindowChrome GlassFrameThickness="-1" />
            </Setter.Value>        
          </Setter>      
          <Setter Property="Template" >
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type my:MainWindow}">
                <Grid>
                  <ContentPresenter Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, 
                    Path=WindowNonClientFrameThickness}" Content="{TemplateBinding Content}" />                            
                </Grid>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
    

    再然后,我用layer = AdornerLayer.GetAdornerLayer(xxx)就获取不到装饰层了

    对所有控件使用,返回的都是null。

    搜索了一下,有一个使用Ribbon控件发生同样问题的(Ribbon也会使用Shell),但却没有任何答案。

    是WindowChrome的问题,还是因为是设置Style的问题,如何解决呢?

    2011年5月23日 9:38

答案

  • 是因为你修改了Window的模板造成的,我们来看下修改前与修改后的Window的可视树结构:
    可以看到,我们遗漏了AdornerDecorator 。所以你所要的正确的模板是:
      <Style TargetType="{x:Type me:MainWindow}">
       <Setter Property="shell:WindowChrome.WindowChrome">
        <Setter.Value>
         <shell:WindowChrome GlassFrameThickness="-1" />
        </Setter.Value>
       </Setter>
       <Setter Property="Template" >
        <Setter.Value>
         <ControlTemplate TargetType="{x:Type me:MainWindow}">
          <Border>
           <AdornerDecorator>
             <ContentPresenter Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, 
                     Path=WindowNonClientFrameThickness}" Content="{TemplateBinding Content}" />
           </AdornerDecorator>       
          </Border>
         </ControlTemplate>
        </Setter.Value>
       </Setter>
      </Style>
    
    通过下面的代码就可以拿到Window的AdornerLayer了:

    var layer = AdornerLayer.GetAdornerLayer(this.Content as Visual);
    

     

     

    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月24日 5:16
    版主