【问题标题】:How to access my CircleProgressBar from my App?如何从我的应用程序访问我的 CircleProgressBar?
【发布时间】:2015-11-23 15:33:36
【问题描述】:

我已经成功地实施了这里找到的解决方案: WPF circle progress bar

我唯一的问题是我的 AXML 使用:

xmlns:local="clr-namespace:MyNameSpace"

<local:CircularProgressBar HorizontalAlignment="Center" VerticalAlignment="Center"
     SegmentColor="#FF878889" StrokeThickness="8" Percentage="100" />
                <local:CircularProgressBar HorizontalAlignment="Center" VerticalAlignment="Center"
     Percentage="{Binding Value, ElementName=slider}" SegmentColor="#026873" StrokeThickness="8" />

如何在加载时隐藏 CircleProgressBar,如何从我的 WPF 应用程序代码更新或启动它?

目前每次加载都会绘制进度指示器。

编辑: 转换器似乎正在工作,但现在绘制了圆圈并且没有任何反应? 这是我的代码:

BooleanToVisibilityConverter convert = new BooleanToVisibilityConverter();
            System.Globalization.CultureInfo culture = null;

            // public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            myName.Visibility =  (System.Windows.Visibility) convert.Convert(true, this.GetType(), myName, culture);

            //listBoxTrackers.Items.Clear();



            readInputFile(dialogFileName);

【问题讨论】:

  • 你的控件没有 Visibility 属性吗?您应该将 Visibility 属性绑定到视图模型上的属性(使用转换器,以便您的 VM 属性只是控制显示或不显示的布尔值)
  • 它只有一个名为 CircularProgressBar.VisibilityProperty 的字段,但这只是一个吸气剂?如何访问在 AXML 中找到的实例? :D

标签: c# wpf


【解决方案1】:

你可以使用绑定来做这样的事情。也别忘了

xmlns:DesignInControl="clr-namespace:***"
xmlns:converter="clr-namespace:***"

MainWindow.Xaml:

<Window.Resources>
    <converter:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>
<Grid Visibility="{Binding Visibility, Converter={StaticResource BooleanToVisibilityConverter}}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
            <DesignInControl:CircularProgressBar HorizontalAlignment="Center" VerticalAlignment="Center"
          SegmentColor="#FF878889" StrokeThickness="25" Percentage="100" />
            <DesignInControl:CircularProgressBar HorizontalAlignment="Center" VerticalAlignment="Center"
          Percentage="{Binding Percentage}" SegmentColor="#026873" StrokeThickness="25" />
        </Grid>
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </StackPanel>
    <Slider x:Name="slider" Grid.Row="1" Maximum="100" Value="60" Visibility="Hidden"/>
</Grid>

MainWindow.cs:

namespace WpfApplication
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Data();
    }
}

public class Data:INotifyPropertyChanged
{
    private bool visibility;
    public bool Visibility 
    { 
        get
        {
            return this.visibility;
        }

        set
        {
            this.visibility = value;
            this.RaisePropertyChanged("Visibility");
        }
    }

    private double percentage;
    public double Percentage 
    { 
        get
        {
            return this.percentage;
        }

        set
        {
            this.percentage = value;
            this.RaisePropertyChanged("Percentage");
        }
    }

    public Data()
    {
        Action SomeWork = new Action(DoWork);
        IAsyncResult result = SomeWork.BeginInvoke(null, null);
    }

    public void DoWork()
    {
        System.Threading.Thread.Sleep(3000);
        Visibility = true;
        for (int i=0;i<100;i++)
        {
            System.Threading.Thread.Sleep(300);
            Percentage += 1;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string info)
    {
        if (PropertyChanged!=null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}
}

BooleanToVisibilityConverter.cs

class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Boolean && (bool)value)
        {
            return Visibility.Visible;
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Visibility && (Visibility)value == Visibility.Visible)
        {
            return true;
        }
        return false;
    }
}

【讨论】:

  • 它目前是我的应用程序中的一个 ListBox,顶部有 CircleProgressBar。这仍然有效吗? :D
  • 优雅的解决方案,但它不适用于 UserControl ;-)
  • 你没有提到你有列表框。如果您在列表框中有 CircleProgressBar。您只需更改与 FindAncestor 的绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2021-01-07
  • 2015-12-15
相关资源
最近更新 更多