none
请教版主,关于UserControl Item中嵌套UserControl控件的问题? RRS feed

  • 问题

  • 在大部分的sample示例中,程序的架构是一个page构成的mainpage页面,然后选择ListBox中的子列项的话,通过将新page映射到一个隐藏frame上的方式,来共享同一块页面区域。

    现我想实现一个类似于“我的电脑”属性那样的属性页面,有个listBox 通过选择不同项,在同一块区域显示不同的控制选择页面,但是该属性页面本身是通过new item中的User control创建的,而不是Blank Page,我想仿照sample中方式去写,结果没有成功,问题出在将frame导航到该选择页面时,即

    HiddenFrame->Navigate(scenario1,this);

    请问是不是该想法无法实现?

    ps:实际上 做的是仿照官网示例device app for webcam 做自己的device app中那个属性页面,示例中属性设置控件较少,所以在有限空间内能布局下来,我自己要做的属性很多,并且希望分基本video control,camer control、effect等等选项卡,因此想到上述方法。

    目前想到另一种替代方法:在公共区域设立一个root stackpanel,将所有选项卡的控件放在各自stackpanel中,stackpanel依次排列在root stackpanel中,但根据选项卡只显示一个,这样的架构导致代码就全在一个xaml对应的cpp和h文件中 有点乱。

    2012年8月31日 2:22

全部回复

  • 你用ItemsControl去显示你的选项卡,然后ItemsControl选中后右边显示你的所绑定的对应Control即可。 简单的例子C#的,可能你需要自己做个转换:

    https://skydrive.live.com/#cid=51B2FDD068799D15&id=51B2FDD068799D15%211098


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月31日 9:26
    版主
  • 感谢Bob的解答,看了您写的示例,我也用C++实现了

    <ListBox Name="lsIcon"  Grid.Column="0"    Margin="0,0,0,0" HorizontalAlignment="Left"
    SelectionChanged="IconItemChange" SelectedIndex="-1">
         <ListBox.ItemTemplate>
             <DataTemplate>
                <Image Source="{Binding IconImg}" Width="68" Height="57" Margin="0,0,0,0"/> 
             </DataTemplate>
         </ListBox.ItemTemplate>
    </ListBox>
    <UserControl Grid.Column="1" Content="{Binding ElementName=lsIcon, Path=SelectedItem.Cnt}"/>

    该段代码是写在device app sample中 deviceAppPage.xaml中,其中IconImg和Cn是自定义绑定类的属性,目的是选择某个图片形式的item,弹出响应UserCotrol的内容。

    自定义绑定类:struc.h

    namespace DeviceAppForWebcam { [Windows::UI::Xaml::Data::Bindable] public ref class Team sealed { public: Team(String^ name,UIElement^ uiElement); property BitmapImage^ IconImg { BitmapImage^ get() { return _iconImg; } property UIElement^ Cnt { UIElement^ get() { return Control; } } private: BitmapImage^ _iconImg; UIElement^ Control; }; [Windows::UI::Xaml::Data::Bindable] public ref class Scenarios sealed { public: Scenarios(); property IVector<Team^>^ Items { IVector<Team^>^ get() { return _items; } } private: ~Scenarios(void){}; Platform::Collections::Vector<Team^>^ _items; }; }

    struct.cpp

    Team::Team(String^ name,UIElement^ uiElement)
    {
    	Control = uiElement;
    	_iconImg = ref new BitmapImage();
    	_iconImg->UriSource = ref new Uri(name);
    }
    Scenarios::Scenarios()
    {
         _items = ref new    
         Platform::Collections::Vector<Team^>(); 
    	
         UIElement^ ctr1 = ref new MyUserControl1();
         Team^ team1 = ref new Team(L"ms-appx:///settingsN.bmp",ctr1);
         _items->Append(team1);
         UIElement^ ctr2 = ref new MyUserControl2();
         Team^ team2 = ref new Team(L"ms-appx:///ControlN.bmp",ctr2);
         _items->Append(team2);
    }

    在deviceAppPage.cpp构造函数中
    m_scenario = ref new Scenarios();
    lsIcon->ItemsSource = m_scenario->Items;
    ///////lsIcon->SelectedIndex = 0;/////////////////

    然后实现listbox的selectedChange响应:
    ::IconItemChange(..._args)
    {
        int selectedListBoxItemIndex = -1; 
        if (lsIcon->SelectedItem != nullptr)
        {
          selectedListBoxItemIndex = lsIcon->SelectedIndex;
        }
       if (selectedListBoxItemIndex==0) //选择第一个item
       {
    	MyUserControl1^ UICtl = safe_cast<MyUserControl1^>(m_scenario->Items->GetAt(selectedListBoxItemIndex)->Cnt);
           //获取第一个UserControl的类对象,初始化其内容
    	UICtl->Initialize(_args);
        }
      else if(selectedListBoxItemIndex==1)//选择第二个item
       {
    	MyUserControl2^ UICtl = safe_cast<MyUserControl2^>(m_scenario->Items->GetAt(selectedListBoxItemIndex)->Cnt);    
         //获取第二个UserControl的类对象,初始化其内容
    		UICtl->Initialize(_args);
    		
    	}
    }

    2012年9月7日 7:17
  • 然而 问题却出现了,  有两种情形:

    第一种:IsIcon->SelectedIndex 不被初始化值,则界面被调用出来后,listbox并未有item选中,手动选择第一或第二个item,有时候对应item的userControl界面内容能显示,有时候却不能显示。

    第二种:IsIcon->SelectedIndex被初始化,界面被调用,假设初始化为0,第一个item被选中,响应usercontrol界面能正确显示,然后选另外一个item,却显示不出来,再点击回初始化那个item,也无法显示了。

    因为device app工程是被camrea  capture sample中more  option调用,都无法单步调试,发现可能是一个camera setting UI Host的进程在通过device app中的onActived()函数来激活该属性页面的。

    我利用上述方法,写一个应用层程序,选择item弹出响应usercontrol,不管是否初始化item的index,都能正常显示和使用,一个程序是直接运行,而上面程序是被间接调用,是否是因为机制不同,导致出现这种问题。

    期待Bob的解答!!!

    2012年9月7日 7:30
  • 这是在应用层实现的一个metro工程示意图,完全能正常工作,但是写在device app中被camaraOptionUI api函数调用时 却出现bug,难道在device app中所有控制选项只能放在有限空间内,采用scrollview下拉实现,这样的话,功能无法区分,代码也都挤在一个cpp里啊。

    2012年9月7日 7:53
  • 能否给我你的完整的实现,可以上传到skydrive 公开目录,我可以下载来调试。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月10日 9:50
    版主
  • 我已上传两个工程:https://skydrive.live.com/?cid=87B1186E06F1D08B&id=87B1186E06F1D08B%21143

    分别用你上面提示的listview加数据绑定的方式(first),以及stackpanel中存放多个隐藏属性页,根据listview选择项显示某个选项的方式(second)

    问题都是在被cameraOptionUI调用出来后,属性页面不能稳定显示,有时能,有时显示不出来。

    在first工程中,更奇怪的是在populateScenarios函数中令listview初始化某项时,该项能正常工作,切换另一项显示不出,再切换回初始项也显示不出了;若不初始listview某项,则有时能显示,有时又不能,同时显示后,对于slider滑动能产生相应效果,但控件本身的那个滑环不动。(我对appxaml.app中OnLaunched作了修改,使工程直接运行也显示属性页面,这时listview选项能正常切换)

    在second工程中,只做了个控件样板,并未调用camerSettingActivatedEvnetArgs^。也出现不稳定显示的情形。你可以多做实验几次就会发现。

    希望Bob能帮忙调试,不清楚问题到底在哪,太郁闷了,这两周一直被这个问题困扰,期待!!!

    ps:现在我正在尝试最简单的一种想法,不用listview了,将所有功能按钮都做在页面上,利用scroview滚动显示。

    2012年9月11日 6:30