WPF设计器 - 选择元素内的元素

时间:2012-08-09 18:28:58

标签: c# .net wpf user-interface gui-designer

我是WPF的新手,所以我会接受每一条建议。我的问题: 我使用Designer以我喜欢的方式放置UI的不同组件。这很棒。这种类型的XAML结构带来了问题:

<Window>
<Grid>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        /* Couple of buttons */
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="223*"/>
            <RowDefinition Height="99*"/>
        </Grid.RowDefinitions>
        <TabControl Margin="85,0,0,0" Padding="0,-5,0,0" Grid.RowSpan="2">
            <TabItem Visibility="Collapsed">
                <Grid>
        /* textboxes and labels */
                </Grid>
            </TabItem>
            <TabItem Visibility="Collapsed">
                <Grid>
                    <Border Visibility="Hidden" Margin="136,66,76,66" Panel.ZIndex="10" BorderThickness="1" Width="320" Height="180">
                        <Grid Background="White">
                            <Grid.Effect>
                                <DropShadowEffect BlurRadius="10" RenderingBias="Quality" Direction="270" ShadowDepth="3" Opacity="0.1"/>
                            </Grid.Effect>
                            /* labels, textboxes and buttons */
                        </Grid>
                    </Border>
                    <TabControl Margin="0,0,0,38">
                        <TabItem>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                /* other elements */
                            </Grid>
                        </TabItem>
                        <TabItem>
                            <Grid> 
                                <Grid>
                                    /* checkboxes */
                                </Grid>
                                <Grid>
                                    /* checkboxes */
                                </Grid>
                                /* labels */
                            </Grid>
                        </TabItem>
                        <TabItem>
                            <Grid>
                            </Grid>
                        </TabItem>
                    </TabControl>
                    /* buttons and labels */
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Grid>

通常当我想在场景中移动某些内容时,我只需选择它并拖动/更改它,因为它比在XAML中编写它要容易得多。但是,使用上面的代码,如果我想从内部TabControl中选择一些东西,我就是不能。它会自动选择上面的那个,这使得管理UI变得更加困难。我猜这与Z-Index有关,但我不太确定。我知道这可能是一个愚蠢的问题,但它让我很挣扎,所以如果有人向我解释,我会非常感激!

谢谢!

2 个答案:

答案 0 :(得分:1)

嗯,我的猜测是你的网格彼此叠加,捕获点击次数并阻止选择下面的元素(如你所说,z顺序)。

需要注意的一些事项

对于设计师来说,这并不是特定的,如果你将Hit Testable元素分层放在每个元素之上,即使它们看起来很透明,它们仍会捕获点击和“偷”焦点。你可以做各种事情来防止这种情况,一个选项可能是你希望点击“通过”到它下面的元素的元素上设置IsHitTestVisible = false。另一种选择是将元素的背景设置为{x:Null},而不是默认值(透明)。

您可以使用VS窗口左侧(或“视图”|“其他Windows”|“文档大纲”)的“文档大纲”面板来直观地浏览可视树。这将允许您“选择”项目,即使它在其他项目下面。但是,即使在文档轮廓中选择它也不会浮动到设计图面的顶部,因此您将无法拖动它来定位它,但您将能够抓住重新调整尺寸处理和访问所选元素的属性窗口。

最终你必须“隐藏”它上面的元素才能获得你想要的拖拽定位。

答案 1 :(得分:1)

我遇到了同样的问题 - 我正在忙着在WPF设计器中布置我的应用程序,我以前可以移动的东西是不可选择的和不可分割的,TabControl始终是关注焦点。

问题似乎是TabItem正在崩溃。我发现无法在具有Visibility="Collapsed"的TabItem中选择任何内容。

如果您需要移动物品,请暂时将可见性更改为Visible - 我可以在设计器中移动内容,然后再将可见性设置回来。

我没有对此进行特别彻底的测试,这有点像kludge,但它对我来说做得很好。