none
两个xaml之间互相操作 RRS feed

  • 问题

  • 我做了一个控件A

    在主窗体上有控件A,还有个Canvas,控件A不在canvas里

    我想单击控件A的的button按钮来实现Canvas的 Visibility="Hidden"

    因为控件A和主窗体不是在一个xaml文件中,请问如何调用呢?


    淡叶
    2009年3月22日 2:09

答案

  • 楼主,你好

    不知道你说的两个xaml是不是控件A是一个类似于userControl的东西。
    如果是,请参考下面的代码。
    UserControl

    <UserControl x:Class="WpfControlLibrary1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="144" Width="422">
        <Grid Height="116" Width="329" Name="UserControlTest">
            <Button Name="button1" Click="button1_Click" Margin="25,0,15,0" Height="38" VerticalAlignment="Bottom">Button</Button>
            <Label Name="label1" Height="48" VerticalAlignment="Top">520505</Label>
        </Grid>
    </UserControl>

    userControl代码:
     private void button1_Click(object sender, RoutedEventArgs e)
            {
                Grid gTest=this.VisualParent as Grid;
                Canvas ctest=gTest.FindName("canvas1") as Canvas;
                this.label1.Content = gTest.Name.ToString() + "\n" + this.Parent.ToString() + "\n" + ctest.Visibility.ToString();           
            }

    主窗体:
    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       
        Title="Window1" Height="467" Width="373"   ResizeMode="CanResizeWithGrip" WindowStyle="ToolWindow">
        <Grid Name="test1">
            <Canvas Margin="41,29,37,0" Name="canvas1" Height="100" VerticalAlignment="Top" />
            <my:UserControl1 Margin="10,184,-16,101" Name="userControl11" xmlns:my="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1" />
        </Grid>
    </Window>





    Microsoft Online Community Support
    • 已标记为答案 淡叶 2009年3月26日 8:03
    2009年3月24日 8:39
  • 我修改了下
    可以在子控件里直接获得父类窗体的值
    usercontrol

     <Grid Height="116" Width="329" Name="UserControlTest">
            <Button Name="button1" Click="button1_Click" Margin="25,0,15,0" Height="38" VerticalAlignment="Bottom">Button</Button>
            <Label Name="label1" Height="48" VerticalAlignment="Top">520505</Label>
        </Grid>


    usercontrol代码

       private void button1_Click(object sender, RoutedEventArgs e)
            {

                Canvas aa = this.VisualParent as Canvas;
                MessageBox.Show(aa.Name.ToString());
           }

    主窗体

    <Grid x:Name="test1" Background="{x:Null}">
            <Canvas x:Name="canvas1" Background="{x:Null}" >
             <WpfApplication3:UserControl2 Width="284" Height="264" Background="{x:Null}" />
            </Canvas>

    </Grid>


    淡叶
    • 已标记为答案 淡叶 2009年3月26日 8:03
    2009年3月25日 1:48

全部回复

  • 楼主,你好

    不知道你说的两个xaml是不是控件A是一个类似于userControl的东西。
    如果是,请参考下面的代码。
    UserControl

    <UserControl x:Class="WpfControlLibrary1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="144" Width="422">
        <Grid Height="116" Width="329" Name="UserControlTest">
            <Button Name="button1" Click="button1_Click" Margin="25,0,15,0" Height="38" VerticalAlignment="Bottom">Button</Button>
            <Label Name="label1" Height="48" VerticalAlignment="Top">520505</Label>
        </Grid>
    </UserControl>

    userControl代码:
     private void button1_Click(object sender, RoutedEventArgs e)
            {
                Grid gTest=this.VisualParent as Grid;
                Canvas ctest=gTest.FindName("canvas1") as Canvas;
                this.label1.Content = gTest.Name.ToString() + "\n" + this.Parent.ToString() + "\n" + ctest.Visibility.ToString();           
            }

    主窗体:
    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       
        Title="Window1" Height="467" Width="373"   ResizeMode="CanResizeWithGrip" WindowStyle="ToolWindow">
        <Grid Name="test1">
            <Canvas Margin="41,29,37,0" Name="canvas1" Height="100" VerticalAlignment="Top" />
            <my:UserControl1 Margin="10,184,-16,101" Name="userControl11" xmlns:my="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1" />
        </Grid>
    </Window>





    Microsoft Online Community Support
    • 已标记为答案 淡叶 2009年3月26日 8:03
    2009年3月24日 8:39
  • 楼上这样做虽然可以,但是性能并不好。
    合理的做法是UserControl暴露一个按钮点击事件。

    好好学习,天天向上。
    2009年3月24日 13:31
  •  如何暴露呀?

    淡叶
    2009年3月24日 16:37
  • TT  正在努力运行之~


    淡叶
    2009年3月24日 16:38
  • KeFang Chen - MSFT 说:

    楼主,你好

    不知道你说的两个xaml是不是控件A是一个类似于userControl的东西。
    如果是,请参考下面的代码。
    UserControl

    <UserControl x:Class="WpfControlLibrary1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="144" Width="422">
        <Grid Height="116" Width="329" Name="UserControlTest">
            <Button Name="button1" Click="button1_Click" Margin="25,0,15,0" Height="38" VerticalAlignment="Bottom">Button</Button>
            <Label Name="label1" Height="48" VerticalAlignment="Top">520505</Label>
        </Grid>
    </UserControl>

    userControl代码:
     private void button1_Click(object sender, RoutedEventArgs e)
            {
                Grid gTest=this.VisualParent as Grid;
                Canvas ctest=gTest.FindName("canvas1") as Canvas;
                this.label1.Content = gTest.Name.ToString() + "\n" + this.Parent.ToString() + "\n" + ctest.Visibility.ToString();           
            }

    主窗体:
    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       
        Title="Window1" Height="467" Width="373"   ResizeMode="CanResizeWithGrip" WindowStyle="ToolWindow">
        <Grid Name="test1">
            <Canvas Margin="41,29,37,0" Name="canvas1" Height="100" VerticalAlignment="Top" />
            <my:UserControl1 Margin="10,184,-16,101" Name="userControl11" xmlns:my="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1" />
        </Grid>
    </Window>





    Microsoft Online Community Support



    我按照你的写 ,为啥一按button就has stop working


    淡叶
    2009年3月25日 0:18
  • 我修改了下
    可以在子控件里直接获得父类窗体的值
    usercontrol

     <Grid Height="116" Width="329" Name="UserControlTest">
            <Button Name="button1" Click="button1_Click" Margin="25,0,15,0" Height="38" VerticalAlignment="Bottom">Button</Button>
            <Label Name="label1" Height="48" VerticalAlignment="Top">520505</Label>
        </Grid>


    usercontrol代码

       private void button1_Click(object sender, RoutedEventArgs e)
            {

                Canvas aa = this.VisualParent as Canvas;
                MessageBox.Show(aa.Name.ToString());
           }

    主窗体

    <Grid x:Name="test1" Background="{x:Null}">
            <Canvas x:Name="canvas1" Background="{x:Null}" >
             <WpfApplication3:UserControl2 Width="284" Height="264" Background="{x:Null}" />
            </Canvas>

    </Grid>


    淡叶
    • 已标记为答案 淡叶 2009年3月26日 8:03
    2009年3月25日 1:48
  • 楼主,你好

    我在我这边测试是正常的。如果你问题还没有解决,请提供信息。

    Microsoft Online Community Support
    2009年3月25日 1:53
  •  哈哈~成功了蛤~研究了三天呢!终于有成果了!

    淡叶
    2009年3月25日 3:11