Наложить 2 элемента управления и переключать, какой из них виден с помощью WPF - PullRequest
2 голосов
/ 14 июля 2011

Это общий вопрос, который будет применяться к любому элементу управления WPF.

То, что я пытаюсь сделать, это поместить два элемента управления друг на друга и переключить, что видно.

Т.е. я хочу контролировать их видимость так, чтобы за один раз был виден только один элемент управления. Один элемент управления обычно будет скрыт, но после какого-либо события будет отображаться поверх другого элемента управления.

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

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

<Grid>
    <Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">
        <Button.Content>About My App</Button.Content></Button>
    <DockPanel Canvas.ZIndex="0"  LastChildFill="True"></DockPanel>
</Grid>

Я не настолько опытен в WPF, но предполагаю, что это должно быть довольно просто - есть предложения?

EDIT:

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

<Grid>
    <Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">
        <Button.Content>About My App</Button.Content></Button>
    <DockPanel></DockPanel>
</Grid>

Изменение видимости кнопки приводит к ее отображению, но панель док-станции и ее содержимое по-прежнему видны сверху кнопки. (кнопка отображается за панелью док-станции из-за порядка z).

Полагаю, я мог бы одновременно переключать видимость панели док-станции (чтобы быть противоположной кнопке), но я надеялся избежать этого.

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Я бы также связал видимость DockPanel с ShowAboutBox, но с использованием обратного конвертера.У меня есть несколько удобных маленьких конвертеров, подобных этому, созданных для сценариев такого типа:

<Grid>
    <Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">About My App</Button>
    <DockPanel Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToInverseVisConverter}}"></DockPanel>
</Grid>

И базовый конвертер (может быть расширен для поддержки обнуляемых значений и т. Д.):

public class BooleanToInverseVisibilityConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return (bool) value ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return null;
    }

}
0 голосов
/ 14 июля 2011

Вы можете использовать универсальный BooleanConverter здесь и соответственно объявить значение True и False.

0 голосов
/ 14 июля 2011

Ваш трюк с ZIndex не работает, потому что кнопка также имеет zindex 0 (так как она первая в коллекции). Вам нужно явно изменить значение ZIndex кнопки на значение, превышающее 0, чтобы панель DockPanel отображалась поверх него.

Тем не менее, правильное решение здесь - просто переключить свойство Visibility кнопки между Hidden и Visible, не меняя ZIndex вообще.

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