Почему мое всплывающее окно отображается напротив свойства Placement на некоторых машинах? - PullRequest
8 голосов
/ 28 октября 2010

У меня есть простое всплывающее окно WPF, которое я показываю, когда пользователь нажимает кнопку.

<Button
    x:Name="aButton"
    Content="Up/Down"
    Width="75"
    Height="30"
    Click="aButton_Click"
/>
<Popup
    PlacementTarget="{Binding ElementName=aButton}"
    Placement="Right"
    VerticalOffset="-31"
    StaysOpen="False"
    AllowsTransparency="True"
>
    <StackPanel>
        <Button Width="45" Height="45" Margin="2,0,2,2" Content="+"/>
        <Button Width="45" Height="45" Margin="2,0,2,0" Content="-"/>
    </StackPanel>
</Popup>

Что очень странно ... этот код работает по-разному в зависимости от того, на какой машине он работает.

Я запускаю этот код на своем главном рабочем столе, и все работает просто отлично ... и как и должно.Я запускаю его на своем нетбуке PDC09 ... и всплывающее окно показывает напротив (слева, а не справа, как я говорил со свойством Placement).

Почему это так?И что я могу с этим поделать?

Ответы [ 2 ]

12 голосов
/ 28 октября 2010

Я не смог ничего найти через Google ... но удачный поиск на форуме WPF , быстро нашел эту запись . Примечание для себя: не забывайте искать на форумах WPF, если Google ничего не может найти.

Ответ таков: мой нетбук PDC09 - это планшетный ПК в глубине души, и, очевидно,Microsoft подумала, что было бы неплохо показать всплывающее окно напротив свойства «Размещение» на планшетном ПК, настроенном для правшей ... таким образом, что всплывающее окно не появляется под рукой пользователя.

Решение состоит в том, чтобы вернуться к пользовательскому размещению всплывающих окон ... если вам не нужно это поведение.

Я хотел бы услышать о любых других способах решения этой проблемы.

1 голос
/ 27 июля 2016

Я исправил эту проблему, добавив границу в том же столбце / строке сетки, что и целевой объект размещения. Затем установите это как цель размещения вместо этого. Привязав ширину этой границы к всплывающему контенту, он автоматически отрегулирует ее ширину, поэтому выравнивание (левое или правое) не имеет значения. Если вы хотите по-прежнему контролировать выравнивание, вы можете сделать это, выровняв целевую границу размещения. Надеюсь, что это имеет смысл, если нет, вот краткий пример.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Popup x:Name="StartMenuPopup" Placement="Top" PlacementTarget="{Binding ElementName=PopupTarget}" >
        <Border x:Name="PopupBorder">
        </Border>
    </Popup>

    <Border x:Name="PopupTarget" Grid.Row="1" Width="{Binding ActualWidth, Mode=OneWay, ElementName=PopupBorder}" 
        BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Top"/>

    <startmenu:TaskBar Grid.Row="1">
        <startmenu:TaskBar.StartButton>
            <startmenu:ToggleMenu Width="36" x:Name="StartButton"
                              ImageData="{Binding StartButtonImageData}"
                              AssociatedPopup="{Binding ElementName=StartMenuPopup}"
                              IsOpen="{Binding StartMenuOpen, Mode=TwoWay}"/>
        </startmenu:TaskBar.StartButton>
    </startmenu:TaskBar>
</Grid>

Всплывающая PlacementTarget привязывается к границе PopupTarget, а ширина границы PopupTarget привязывается к элементу PopupBorder. Это делает границу PopupTarget такой же ширины, как и у всплывающего окна, что устраняет проблему с выравниванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...