【问题标题】:WPF - Show command-line args in a labelWPF - 在标签中显示命令行参数
【发布时间】:2015-09-21 15:57:59
【问题描述】:

我有一个需要使用多个命令行参数调用的 wpf 应用程序。出于这个原因,我如何在我放在窗口中的标签中显示它们? 我试图实现数据绑定,但没有成功, - 变量被正确读取和分配,但由于某种荒谬的原因,在我想要的标签中没有显示在屏幕上。 代码如下:

public partial class MainWindow : Window
{
    public Notification _notif = new Notification();
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Notification();
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        App.Current.Shutdown();
    }
}

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e){
        if (e.Args.Length >= 4)
        {
            MainWindow mainWindow = new MainWindow();

            Label count_label = (Label)mainWindow.FindName("count");
            count_label.DataContext = mainWindow._notif;

            System.Diagnostics.Debug.WriteLine(mainWindow._notif.count + " - notif.count");
            // bind the Date to the UI
            count_label.SetBinding(Label.ContentProperty, new Binding("count")
            {
                Source = mainWindow._notif,
                Mode = BindingMode.TwoWay
            });
            //assigning values to the labels

            System.Diagnostics.Debug.WriteLine(count_label.Content + " - content of the label 'count'");
            mainWindow._notif.count = e.Args[0];
            System.Diagnostics.Debug.WriteLine(e.Args[0] + " is the argument n. 0");
            System.Diagnostics.Debug.WriteLine(mainWindow._notif.count + " - notif.count");


            System.Diagnostics.Debug.WriteLine(count_label.Content + "-------------------");

            System.Diagnostics.Debug.WriteLine(count_label.Content + " - content of the label 'count'");
            mainWindow._notif.count = "1234";
            System.Diagnostics.Debug.WriteLine(mainWindow._notif.count + " - notif.count");
            System.Diagnostics.Debug.WriteLine(count_label.Content + " - content of the label 'count'");

        }
    }
}

public class Notification : INotifyPropertyChanged
{
    private string _count;

    public string count {
        get {
            return _count;
        }

        set {
            _count = value;
            OnPropertyChanged("count");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

在这里您可以看到来自 xaml 的 sn-p:

<Label x:Name="count" Content="{Binding count}" HorizontalAlignment="Center" Margin="0,10,486,0" VerticalAlignment="Top" RenderTransformOrigin="-2.895,-0.769" Height="80" Width="145" FontFamily="Arial" FontSize="64" HorizontalContentAlignment="Center"/>

谢谢你。

【问题讨论】:

  • App OnStartUp 方法中的 MainWindow 实例与 App.xaml 中指定的 StartupUri 不同
  • 要将 args 传递给 MainWindow,您必须在 MainWindow 内创建一个属性,例如名为 CommandArgs 的 List 属性,然后在创建 MainWindow 对象后循环 Args 列表并添加其内容到 CommandArgs 列表

标签: c# wpf label args


【解决方案1】:

该示例说明了如何在标签中显示参数。

这是应用程序的入口点:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var argumentsInfo = BuildArgumentsInfo(e.Args);
        var viewModel = new MainWindowViewModel(argumentsInfo);
        var window = new MainWindow(viewModel);
        window.Show();
    }

    private string BuildArgumentsInfo(string[] args)
    {
        return args.Any()
            ? args.Aggregate((arg1, arg2) => arg1 + " " + arg2)
            : "No arguments";
    }
}

这是视图模型(视图的数据上下文):

public interface IMainWindowViewModel
{
    string Arguments { get; set; }
}

public class MainWindowViewModel : IMainWindowViewModel, INotifyPropertyChanged
{
    private string _arguments;

    public MainWindowViewModel(string argumentsInfo)
    {
        Arguments = argumentsInfo;
    }

    public string Arguments
    {
        get { return _arguments; }
        set
        {
            _arguments = value;
            RaisePropertyChanged("Arguments");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

这是视图(后面的代码):

public partial class MainWindow : Window
{
    public MainWindow(IMainWindowViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }
}

这是视图中的标签 (XAML):

<Label Content ="{Binding Arguments}"></Label>

重要提示!您必须从 App.xaml 文件中删除 StartupUri="MainWindow.xaml,因为 MainWindow 是从后面的代码启动的。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2013-12-02
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2010-09-14
    • 2020-11-26
    相关资源
    最近更新 更多