WPF切换2控件在同一位置

时间:2017-10-14 02:54:14

标签: c# wpf

我想要做的是将两个控件放在同一个位置/位置,具体是一个包含ProgressBar的按钮和一个包含Icon的按钮,一旦进度条已满,我想切换它具有图标的按钮,如复选框/切换按钮,它有多个状态,当我更改它时,它会更改控件。

控件的图片示例:

Image

OBS:控件位于使用MahApps的标题栏控件中 OBS2:我正在使用Material Design XAML和Caliburn.Micro来制作出色的MVVM

XAML示例:

<Button FontSize="15"
                FontWeight="Bold"
                cal:Message.Attach="UpdateStatus"
                ToolTip="Click here to show the update status."
                Visibility="Visible">

            <ProgressBar Style="{StaticResource MaterialDesignCircularProgressBar}"                     
                         Value="0"
                         IsIndeterminate="True"
                         VerticalAlignment="Center" 
                         HorizontalAlignment="Center"
                         Height="22"
                         Width="22" Foreground="White"/>
        </Button>
        <Button FontSize="15"
                FontWeight="Bold"
                cal:Message.Attach="Restart"
                ToolTip="A update is scheduled, click here to restart the loader and apply the update."
                Visibility="{Binding Path=RestartButtonVisibility, Mode=TwoWay}">

            <materialDesign:PackIcon Height="22"
                                     Width="22"
                                     Kind="Cached" 
                                     FontWeight="Bold"/>
        </Button>

有可能完成吗?是否有一种不是意大利面的好方法来实现它?

2 个答案:

答案 0 :(得分:0)

您可以将第一个按钮的可见性绑定到VM中的属性(如第二个),并使它们互斥(一个可见,然后折叠)。在进度条完成结束时触发onpropertychanged,你应该好好去。

答案 1 :(得分:0)

要在同一位置放置两个UI元素,您可以将它们放在Grid中。您只需将它们设置为相同的行/列(或者根本不设置任何内容)。然后,您可能需要实现一个新的IValueConverter来完成这个技巧。

首先,在本地命名空间中的某个类:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

.
.
.

public class MyValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double v = (double)value;
        if (v == 100) return Visibility.Visible;
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Not really necesary...
        return 0.0;
    }
}

这是一个价值转换器。它与属性绑定一起使用,就像你想要做的那样。

现在,您的XAML:

<!-- This should be atop... -->
<Window.Resources>
    <local:MyValueConverter x:Key="ValueConverter1"/>
</Window.Resources>

.
.
.

<Grid>
    <Button x:Name="Button1">
        <ProgressBar x:Name="ProgressBar1" Value="50" Width="100" Height="8"/>
    </Button>
    <Button x:Name="Button2" Visibility="{Binding Value, ElementName=ProgressBar1, Converter={StaticResource ValueConverter1}}">
        <StackPanel Orientation="Horizontal">
            <Image Source="yourIcon"/>
            <TextBlock Text="Label for your button"/>
        </StackPanel>
    </Button>
</Grid>

我们使用值转换器来绑定第二个按钮的可见性,这样,如果进度条值为100,则Visibility属性的值将为Visibility.Visible,反之亦然