2017-10-14 48 views
0

我想要做的是將兩個控件放在相同的位置/點,具體來說是一個按鈕,其中包含一個ProgressBar和一個包含圖標的按鈕,一旦進度欄已滿,我想將它切換到具有圖標的按鈕,如複選框/切換按鈕,它有多個狀態,當我更改它時,它會更改控件。控件WPF切換2控件在同一地點

形象的例子:

Image

OBS:這種控制的使用MahApps
標題欄控件 OBS2:我使用的材料設計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> 

是否有可能一個完成那個?有沒有一種不是意大利麪的完美方式?

回答

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,反之亦然。

+0

更好地寫'返回(雙)值<100? Visibility.Collapsed:Visibility.Visible',或'return(double)value <100? Visibility.Hidden:Visibility.Visible',如果你想提前完成佈局。如果轉換器不支持反向轉換,則拋出NotSupportedException。只是要有點細緻。 – Clemens

+0

謝謝你們,網格技巧解決了這個問題,但我會以另一種方式處理可見性變化。 –

0

您可以將第一個按鈕的可見性與第二個VM中的屬性綁定,並使它們互斥(一個可見,然後其他已摺疊)。在進度條完成結束時觸發onpropertychanged,你應該很好。