弹出控件随父级移动

时间:2011-04-20 20:41:44

标签: wpf

希望这对你来说是一个快速的WPF专家。当寡妇移动或改变大小时,是否有任何简单的XAML解决方案允许我的弹出窗口移动?代码如下。如果没有,我总是可以在后面的代码中处理一个事件。

<Grid>
    <Canvas>
        <Expander Header="details" HorizontalAlignment="Center" VerticalAlignment="Top" ExpandDirection="Down"
                  Expanded="Expander_Expanded" Panel.ZIndex="99" Collapsed="Expander_Collapsed" Name="expander">

                <Popup PopupAnimation="Slide" Name="popup" Width="200" Height="200" StaysOpen="True" AllowsTransparency="True" 
                       IsOpen="False" >
                <Grid Background="Cornsilk">
                    <Grid.BitmapEffect>
                        <DropShadowBitmapEffect/>
                    </Grid.BitmapEffect>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                   <TextBlock TextWrapping="Wrap" FontWeight="Bold">
                      Some example text
                   </TextBlock>
                </Grid>
            </Popup>

        </Expander>
    </Canvas>
</Grid>

3 个答案:

答案 0 :(得分:22)

这几乎是Rick的答案,但是在代码隐藏中,因为我看到绝对没有理由引入另一个依赖。

protected override void OnLocationChanged(EventArgs e)
{
    popup.HorizontalOffset += 1;
    popup.HorizontalOffset -= 1;
    base.OnLocationChanged(e);
}

只需复制&amp;粘贴到窗口的代码隐藏,并将popup标识符替换为弹出窗口实例的标识符。


我觉得它好多了,它更简洁,它不会使用你必须取消订阅或内存泄漏的事件。
对于你的应用程序的运行时,覆盖会有更好的表现(没有什么值得注意的,但微观表现非理性主义者,比如你的真实,仍然会喜欢它)。

答案 1 :(得分:3)

以下是使用以下解决方案:

此仅标记示例包含文本框和弹出窗口。当文本框被聚焦时,弹出窗口将打开。弹出窗口跟随窗口移动时挂钩窗口的位置更改事件并强制弹出窗口相应地重新定位。

<Grid>
    <StackPanel>
        <TextBox x:Name="textBox1" Width="200" Height="20"/>
        <Popup PlacementTarget="{Binding ElementName=textBox1}" IsOpen="{Binding IsKeyboardFocused, ElementName=textBox1, Mode=OneWay}">
            <TextBlock Background="White" Text="Sample Popup content."/>
            <p:Attached.Operations>
                <p:EventHandler Path="Loaded">
                    <p:ScriptHandler Path="@FindAncestor([Window], @AssociatedObject.PlacementTarget).LocationChanged">
                        @AssociatedObject.HorizontalOffset += 1;
                        @AssociatedObject.HorizontalOffset -= 1;
                    </p:ScriptHandler>
                </p:EventHandler>
            </p:Attached.Operations>
        </Popup>
    </StackPanel>
</Grid>

答案 2 :(得分:0)

不幸的是,没有快速解决方案。您可以使用我在此处描述的技巧:How to make WPF Combobox's Dropdown stays open & Placement