从C#代码隐藏设置WPF窗口标题时的奇怪行为

问题描述 投票:-1回答:2

这是尝试运行How do I programmatically change the Title in a wpf window?建议的答案

<Window x:Class="WindowTitle.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:local="clr-namespace:WindowTitle"
     mc:Ignorable="d"
     MinWidth="600" SizeToContent="WidthAndHeight" Title="{Binding MyTitle}">
    <Grid Margin="5">
         <Button Click="Button_Click" Content="Change Title" Width="100"/>
    </Grid>
</Window>

代码隐藏:

using System.Windows;

namespace WindowTitle
{
    public partial class MainWindow : Window
    {
        private int counter = 0;
        public void Button_Click(object sender, RoutedEventArgs e)
        {
            MyTitle = counter.ToString();
            ++counter;
            System.Diagnostics.Debug.Assert(MyTitle != DefaultTitle);
        }
        public const string DefaultTitle = "Default Title";
        public MainWindow() { InitializeComponent(); DataContext = this; }
        public string MyTitle { get; set; } = DefaultTitle;
    }
}

代码在加载时设置标题,但在随后单击按钮时不设置。

有任何想法吗?我很难过。

c# wpf titlebar
2个回答
0
投票

绑定不知道MyTitle已经改变。沟通变革的常用方式是实施INotifyPropertyChanged;还要看一下MVVM,这是通过DataContext实现它的一种非常常见的方式。


0
投票

我认为INotifyPropertyChanged是自动支持的;我错了。这是工作代码:

<Window x:Class="WindowTitle.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WindowTitle"
            mc:Ignorable="d"
            MinWidth="400"
            SizeToContent="WidthAndHeight"
            Title="{Binding MainWindowTitle}">
    <Grid Margin="5">
        <Button Click="Button_Click"
                    Content="Change by Binding"
                    HorizontalAlignment="Left"
                    Padding="5,0"/>
        <Button x:Name="ChangeBtn"
                    Click="ChangeBtn_Click"
                    Content="Change by Name"
                    HorizontalAlignment="Right"
                    Padding="5,0"/>
    </Grid>
</Window>
using System.Windows;
namespace WindowTitle {
    public partial class MainWindow : Window, System.ComponentModel.INotifyPropertyChanged {
        public void Button_Click(object sender, RoutedEventArgs e) {
            MainWindowTitle = titleCount.ToString();
            ++titleCount;
        }
        void ChangeBtn_Click(object sender, RoutedEventArgs e) {
            --titleCount;
            Title = titleCount.ToString();
        }
        public MainWindow() { InitializeComponent(); DataContext = this; }
        public string MainWindowTitle {
            get { return mainWindowTitleBase; }
            set {
                value = value.Trim();
                if (value != mainWindowTitleBase) {
                    mainWindowTitleBase = value;
                    OnPropertyChanged("MainWindowTitle");
                }
            }
        }
        string mainWindowTitleBase = "Default Title";
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        int titleCount = 0;
        protected void OnPropertyChanged(string /*property name*/ ptyNam) {
            PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(ptyNam));
        }
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.