窗口里有两个Grid  叫A和B   A中某按钮的click事件的作用是使得B中某个按钮的背景颜色改变。我自己的想象中应该是个有一个将B中的button跟A中连起来的一行代码,然后button.background再去变。
不知道是不是这样?
如果是,麻烦告知应该是怎样的一行代码。
如果不是  还请指教怎么去改。wpf

解决方案 »

  1.   

    <Button x:Name="A" Click="A_Click" />
            <Button x:Name="B" Background="Red" Content="B"/>
    在buttonA里面click的后台代码里直接写
    private void A_Click(object sender, RoutedEventArgs e)
            {
                B.Background =  Brushes.Blue;//或者new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ff555555"))
            }
      

  2.   


    要是Button B 在另一个窗口的区域里   button的名字就会有重复吧。默认命名不都是button1 button2之类的吗。  那还能不能让button B变色呢?  
      

  3.   


    要是Button B 在另一个窗口的区域里   button的名字就会有重复吧。默认命名不都是button1 button2之类的吗。  那还能不能让button B变色呢?  不在同一个窗口 你需要抛事件 然后再另外一个窗口监听 
    在事件处理函数里面写把button换颜色的代码
    还有或者你在a窗口里面搞个b窗口的引用
    然后调用b里面的方法 让b里面的button换颜色
      

  4.   


    要是Button B 在另一个窗口的区域里   button的名字就会有重复吧。默认命名不都是button1 button2之类的吗。  那还能不能让button B变色呢?  不在同一个窗口 你需要抛事件 然后再另外一个窗口监听 
    在事件处理函数里面写把button换颜色的代码
    还有或者你在a窗口里面搞个b窗口的引用
    然后调用b里面的方法 让b里面的button换颜色好高深,写b里的变色方法我会,引用应该是个什么样子的?
      

  5.   

    就是在a窗口里面放个变量 windowB b=new window();
    b.你变色的方法 在A里面就直接执行就行了
    懂了吧 和普通类直接的调用一样
      

  6.   


    明白了  我这就去写写看  我按着你说的试了下  给你看看……B窗口中的变色方法
    public void ButtonBS ()
            {
                button1.Background = Brushes.White;
                button2.Background = Brushes.LightBlue;
            }A窗口中的引用
    private void Hyperlink_Click(object sender, RoutedEventArgs e)
            {
                Window2 win2 = new Window2();
                win2.ButtonBS();
            }我这么写没见有变化,也不报错  是不是哪里出问题了?
      

  7.   


     新手求详细点……你上网搜C#委托,很多的。this.invoke{form2.textbox.text="1";}
      

  8.   


    明白了  我这就去写写看  我按着你说的试了下  给你看看……B窗口中的变色方法
    public void ButtonBS ()
            {
                button1.Background = Brushes.White;
                button2.Background = Brushes.LightBlue;
            }A窗口中的引用
    private void Hyperlink_Click(object sender, RoutedEventArgs e)
            {
                Window2 win2 = new Window2();
                win2.ButtonBS();
            }我这么写没见有变化,也不报错  是不是哪里出问题了?你期待什么变化?
    本质上你根本没有理解我的意思
    给你描述一下场景吧 代码就不写了 自己动手吧首先你有个main的程序
    里面new出来两个window a b(都执行下show方法就把两个window都show出来)
    然后你吧b当做个变量传给a a中有个property是bwindow类型的
    然后你在a里面直接操作b就行了呗
    你new一个window 也不show出来 
    怎么看b啊?
    发现你思路有点混乱。
      

  9.   

    这个和委托有个毛线的关系
    乱扯。就是个简单的窗体传值 或者事件
    怎么就往委托上扯呢 呵呵 
    你如果说mvvm直接改vm里的数据 自动跟新 我到觉得你是个稍微懂行的
    上来就直接扯委托。。就不要误人子弟了 哈哈
      

  10.   

    这个和委托有个毛线的关系
    乱扯。就是个简单的窗体传值 或者事件
    怎么就往委托上扯呢 呵呵 
    你如果说mvvm直接改vm里的数据 自动跟新 我到觉得你是个稍微懂行的
    上来就直接扯委托。。就不要误人子弟了 哈哈
    我感觉楼主是说两个窗体都打开了,然后点击A窗口的Button去触发B窗口的事件。
      

  11.   

    这个和委托有个毛线的关系
    乱扯。就是个简单的窗体传值 或者事件
    怎么就往委托上扯呢 呵呵 
    你如果说mvvm直接改vm里的数据 自动跟新 我到觉得你是个稍微懂行的
    上来就直接扯委托。。就不要误人子弟了 哈哈
    我感觉楼主是说两个窗体都打开了,然后点击A窗口的Button去触发B窗口的事件。嗯,是这么个想法……
      

  12.   

    当然你要是从a传一个参数,接着在b上面自动调用,b控件修改不需要委托。你如果要在a上面直接修改b的控件属性,我不知道为什么可以不用委托。
      

  13.   

    试了一下,好像也可以直接去用。        WindowB b;
            public MainWindow()
            {
                InitializeComponent();
            }        private void Button_Click(object sender, RoutedEventArgs e)
            {
                b = new B();
                b.Show();
            }
            //这里触发事件直接调用B就可以了
            private void ButtonA_Click(object sender, RoutedEventArgs e)
            {
                b.buttonB.Background = new 
    LinearGradientBrush(Colors.Yellow,Colors.LightBlue,20);
            }
      

  14.   

    public Form2()
            {
                InitializeComponent();
            }
            public void changeButtonColor()
            {
                button1.BackColor = Color.Blue;
            }
      public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.changeButtonColor();
                f.Show();        }直接这样可以,因为这个实际是在form2里面改得。不是直接在form1里面改
      

  15.   


    那什么样才算是在form1里面改的?
    我之前理解的是把B窗口先打开,再在A窗口里面点一下Button去改变B窗口的Button颜色
      

  16.   

    我上次用委托是因为我开了几个线程,在线程中有form的控件参数修改。让我想想啊。
      

  17.   

    恩,仔细看了下,委托没弄清楚,以前都是在多线程中用的委托,form不同也是线程不同的,但是form中的控件是被保护的,没法跨线程直接调用。抱歉。
      

  18.   

    To 两位楼上的 对于这个比较简单的问题问题 我觉得还是有必要和你们说说的
    首先17楼得做法是完全不正确 而且会引来n多问题的
    虽然你可以这样直接去修改b窗口的背景颜色 甚至可以去handel按钮的事件
    但是 你这样却破坏了b的封装性 而且其他项目不知道 wpf项目 混淆加密代码的时候会遇到问题这样写
    其次说说正确的做法
    1.调用b中public方法的方式 在b窗口里面写个public函数的接口给外面调用 不要直接操作b中的button
    2.采用事件机制 在b中keep一个a的引用 然后a的button点击后抛事件 然b去handel
    3.采用mvvm模式 直接去改b的vm里面的数据即可 界面自动更新 
    这三种方式是我一般会采用的方式
    当然 这都是比较入门和基础的知识
    还有就是对于多线程或者异步调用 需要注意 只有主线程可以操作ui对象 需要使用dispatcher
    否则会报错说没有线程access权限拿个分我容易么我..........................
      

  19.   

    To 两位楼上的 对于这个比较简单的问题问题 我觉得还是有必要和你们说说的
    首先17楼得做法是完全不正确 而且会引来n多问题的
    虽然你可以这样直接去修改b窗口的背景颜色 甚至可以去handel按钮的事件
    但是 你这样却破坏了b的封装性 而且其他项目不知道 wpf项目 混淆加密代码的时候会遇到问题这样写
    其次说说正确的做法
    1.调用b中public方法的方式 在b窗口里面写个public函数的接口给外面调用 不要直接操作b中的button
    2.采用事件机制 在b中keep一个a的引用 然后a的button点击后抛事件 然b去handel
    3.采用mvvm模式 直接去改b的vm里面的数据即可 界面自动更新 
    这三种方式是我一般会采用的方式
    当然 这都是比较入门和基础的知识
    还有就是对于多线程或者异步调用 需要注意 只有主线程可以操作ui对象 需要使用dispatcher
    否则会报错说没有线程access权限拿个分我容易么我..........................
      

  20.   


    是变色了,还小激动了一下。
    但f.Show();之后,是重新出来一个form2,那如果两个form本身就同时存在,点击后直接修改form2而不是重新出来一个,应该如何处理呢
      

  21.   

    Form2 f = new Form2();
            public Form1()
            {
                InitializeComponent();
                f.Show();   
            } 
    private void button1_Click(object sender, EventArgs e)
            {
                f.changeButtonColor();
            }
      

  22.   

    关键看你的理解了 其实就是函数指针
    。net里面的Action啊 事件啊 其实都是委托
    比如让你自己写个类似menu的控件 用户可以指定任意多个item和item所执行的方法(类似右键菜单)
    你不可能写死每个条目所需要执行的函数
    所以可以用委托 达到动态执行不同函数的效果
      

  23.   

    关键看你的理解了 其实就是函数指针
    。net里面的Action啊 事件啊 其实都是委托
    比如让你自己写个类似menu的控件 用户可以指定任意多个item和item所执行的方法(类似右键菜单)
    你不可能写死每个条目所需要执行的函数
    所以可以用委托 达到动态执行不同函数的效果
    - -  我就是昨天加你Q的那个   前面的都得是新弹一个窗口变色,我又有点表述不清楚,所以还麻烦有空私聊
      

  24.   

    26楼改了form1的程序,是按键按了之后变色。
      

  25.   

    贴代码了<Window x:Class="TestApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TestApp"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <local:PartA  x:Name="PartAInstance"/>
            <StackPanel Grid.Column="1">
                <Button x:Name="BtnA" Content="Step A" Width="90" Height="30"/>
                <Button x:Name="BtnB"  Content="Step B" Width="90" Height="30"/>
                <Button x:Name="BtnC"  Content="Step C" Width="90" Height="30"/>
            </StackPanel>
        </Grid>
    </Window>
    namespace TestApp
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.PartAInstance.StepAEvent += new EventHandler<EventArgs>(PartAInstance_StepAEvent);
                this.PartAInstance.StepBEvent += new EventHandler<EventArgs>(PartAInstance_StepBEvent);
                this.PartAInstance.StepCEvent+=new EventHandler<EventArgs>(PartAInstance_StepCEvent);
            }        void  PartAInstance_StepCEvent(object sender, EventArgs e)
            {
                BtnA.Background = Brushes.Blue;
                BtnB.Background = Brushes.Blue;
                this.BtnC.Background = Brushes.Red;
            }        void PartAInstance_StepBEvent(object sender, EventArgs e)
            {
                BtnA.Background = Brushes.Blue;
                BtnC.Background = Brushes.Blue;
                BtnB.Background = Brushes.Red;
            }        void PartAInstance_StepAEvent(object sender, EventArgs e)
            {
                BtnC.Background = Brushes.Blue;
                BtnB.Background = Brushes.Blue;
                BtnA.Background = Brushes.Red;
            }
        }
    }
    <UserControl x:Class="TestApp.PartA"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/up-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <StackPanel>
            <Button Content="Step A" Click="ButtonA_Click"/>
            <Button Content="Step B" Click="ButtonB_Click"/>
            <Button Content="Step C" Click="ButtonC_Click"/>
        </StackPanel>
    </UserControl>namespace TestApp
    {
        /// <summary>
        /// Interaction logic for PartA.xaml
        /// </summary>
        public partial class PartA : UserControl
        {
            public event EventHandler<EventArgs> StepAEvent;
            public event EventHandler<EventArgs> StepBEvent;
            public event EventHandler<EventArgs> StepCEvent;
            public PartA()
            {
                InitializeComponent();
            }        private void ButtonA_Click(object sender, RoutedEventArgs e)
            {
                if (this.StepAEvent != null)
                    this.StepAEvent(this, new EventArgs());
            }        private void ButtonB_Click(object sender, RoutedEventArgs e)
            {
                if (this.StepBEvent != null)
                    this.StepBEvent(this, new EventArgs());
            }
            private void ButtonC_Click(object sender, RoutedEventArgs e)
            {
                if (this.StepCEvent != null)
                    this.StepCEvent(this, new EventArgs());
            }
        }
    }