当前位置:编程学习 > C#/ASP.NET >>

WPF 后台改变属性值,前台UI不响应

新手研究WPF,遇到了问题,请大家帮帮忙!
MainWindow中有个Button,下方有个frame,可以根据需要在MainWindow中打开page1或page2;
在page2中有个ComboBox,有中文和英文两个选择。想要实现:page2的ComboBox选中文,button的fontFamily属性值为SimSun,选英文,属性值变为Arial。
我遇到的问题是:fontFamily属性值会随着comboBox的选择而改变,但MainWindow的界面并无效果。
这是为什么呢?
我用了事件委托、INotifyPropertyChanged监听属性改变,还有就是在page2中调用MainWindow中的方法,方法体里设置属性值。三种都不行,同样的方法,page2中界面字体却能正常显示,这是为啥呢?
请大家帮帮忙!
WPF --------------------编程问答-------------------- 有没有绑定到需要改变的控件?你确定主窗体的值被修改了? --------------------编程问答-------------------- 有绑定的
我現在貼下我的简化代碼:实现INotifyPropertyChanged接口的方法,不知道哪里疏忽,总出问题
MainWindow.xaml.cs:
public partial class MainWindow : Window
    {
        private static Int16 flag = 0;
        public MainWindow()
        {
            InitializeComponent();
            ChangeFont();
        }

        public MainWindow(Int16 fontItem)
        {
            flag = fontItem;
            //ChangeFont();
        }

        public void ChangeFont()
        {
            TBName text = new TBName();
            button.DataContext = text;//会在这句报错:No disassembly available.
            if (flag == 0)
            {
                CultureInfo currentCultureInfo = CultureInfo.CurrentCulture;
                if (currentCultureInfo.Name.ToString() == "zh-CN")
                {
                    text.FontName = "SimSun";
                }
                else
                {
                    text.FontName = "Arial";
                }
            }
            else if (flag == 1)
            {
                text.FontName = "Arial";
            }
            else if (flag == 2)
            {
                text.FontName = "SimSun";
            }
            Console.WriteLine("text.FontName={0},button.Content={1} ", text.FontName, button.Content);
        }
MainWindow.xaml:
<DockPanel >
            <Button Name="button1" Click="button1_Click" Width="60">page1</Button>
            <Button Name="button2" Click="button2_Click" Width="60">page2</Button>
            <Button Name="button" Content="{Binding Path=FontName,Mode=TwoWay}" HorizontalAlignment="Right" Click="Button_Click" Width="60"></Button>
        </DockPanel>

Page2.xaml:
<StackPanel Orientation="Horizontal">
            <Label Content="Language:" Height="23"></Label>
            <ComboBox Name="selectLan" Width="100" Height="30" SelectionChanged="selectLan_SelectionChanged">
                <Label>English</Label>
                <Label>中文</Label>
            </ComboBox>
        </StackPanel>

Page2.xaml.cs:
  private void selectLan_SelectionChanged(object sender,  SelectionChangedEventArgs e)
        {
            if (selectLan.SelectedIndex == 0)
            {
                flag = 1;
            }
            else if(selectLan.SelectedIndex == 1)
            {
                flag = 2;
                
            }
            MainWindow window = new MainWindow(flag);
            window.ChangeFont();//在这里调用为什么会在button.DataContext = text;这句出错           
        }

TBName.cs:
namespace WPFChangeFont
{
    class TBName:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        { 
            if (PropertyChanged!=null)
            {
                PropertyChanged(this,new PropertyChangedEventArgs(info));
            }
        }

        private string _fontName="Font";
        public String FontName
        {
            get { return this._fontName; }
            set
            {
                if (value != this._fontName)
                {
                    this._fontName = value;
                    NotifyPropertyChanged("FontName");
                }
            }
        }
    }
}
请大家帮帮忙 --------------------编程问答--------------------

  MainWindow window = new MainWindow(flag);
            window.ChangeFont();//在这里调用为什么会在button.DataContext = text;这句出错           

不知道你为什么在page2的Selected_Changed事件中new MainWindow出来,MainWindow不是主窗体,而且你首先把你的调用产生的错误解决了吧,
好好看看系统调试时的详细错误提示
感觉好像一个很简单的东西,被你搞复杂了~ --------------------编程问答-------------------- 我是想在page2触发Selected_Changed事件时,调用mainWindow里的ChangeFont()函数,进而改变window中属性值,这样的逻辑有问题吗?可以指出我错在哪吗?
MainWindow是主窗体啊,page2是在page1中打開的啊
我不明白這個“No disassembly available”是什麽錯誤啊,沒其他提示了
我是新手,目前在尝试各种方法想解决这个问题,上面我的code是有什么问题呢?不明白,请求帮助 --------------------编程问答-------------------- MainWindow window = new MainWindow(flag); 这是再新创建个mainwindow,可不是指向原先的mainwindow --------------------编程问答-------------------- #5楼说的对哦,这个被我忽视了,
那这种page2向父窗体传值应该用什么方法啊? --------------------编程问答-------------------- 不new MainWindow,那我要怎么调用主窗体里的函数呢?求指教 --------------------编程问答--------------------   MainWindow window = new MainWindow(flag);
            window.ChangeFont();//在这里调用为什么会在button.DataContext = text;这句出错   

你在第二个窗体重新new了一个主窗体,已经不是原来的窗体了 亲

此处最笨的实现方式是:
在Page2中第一个类型为MainWindow 的变量/属性  等等
在MainWindow 中打开Page2的时候,把自己付给它

说白了 就是建立两个窗体之间的联系,让他们互相“认识”         --------------------编程问答--------------------
引用 4 楼 ln089094293ln 的回复:
我是想在page2触发Selected_Changed事件时,调用mainWindow里的ChangeFont()函数,进而改变window中属性值,这样的逻辑有问题吗?可以指出我错在哪吗?
MainWindow是主窗体啊,page2是在page1中打開的啊
我不明白這個“No disassembly available”是什麽錯誤啊,沒其他提示了
我是新手,目前在尝试各种方法想解决这个问题,上面我的code是有什么问题呢?不明白,请求帮助
ChangeFont()方法是你自己写的吧?把他写成静态,在返回类型前加static即可,调用时直接用this或MainWindow --------------------编程问答-------------------- 你新建一个Globla类 里面一个静态属性
public static CustomerFont CF=new CustomerFont();

然后CustomerFont继承Notifier...等等的处理,

CustomerFont里面一个属性 Font

然后把Globla.CF 绑定btn.DataContext=Globla.CF ;
btn的 fontfmaily={bind Font}


然后cbo 选择改变的时候 Globla.CF.Font=选择的值 --------------------编程问答--------------------
引用 10 楼 qq873113580 的回复:
你新建一个Globla类 里面一个静态属性
public static CustomerFont CF=new CustomerFont();

然后CustomerFont继承Notifier...等等的处理,

CustomerFont里面一个属性 Font

然后把Globla.CF 绑定btn.DataContext=Globla.CF ;
btn的 fontfmaily={bind Font}


然后cbo 选择改变的时候 Globla.CF.Font=选择的值


对了绑定这边 要双向

fontfmaily={bind Font,model=twoway}
--------------------编程问答--------------------
引用 8 楼 yanbuodiao 的回复:
  MainWindow window = new MainWindow(flag);
            window.ChangeFont();//在这里调用为什么会在button.DataContext = text;这句出错   

你在第二个窗体重新new了一个主窗体,已经不是原来的窗体了 亲

此处最笨的实现方式是:
在Page2中第一个类型为MainWindow 的变量/属性  等等
在MainWindow 中打开Page2的时候,把自己付给它

说白了 就是建立两个窗体之间的联系,让他们互相“认识”        

非常感谢!采用你提供的方法成功了!
不过,我还是会继续努力研究看看有没有其它不笨的方法的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,