【问题标题】:Panel change from ListBox从 ListBox 更改面板
【发布时间】:2014-03-03 16:57:48
【问题描述】:

编辑编辑:我发现了这个问题。我们将 : 放在 case 和 value 之间,它需要放在后面。示例:案例“一般”:

感谢您的宝贵时间和大家的意见。

原文:

这必须比我尝试做的简单得多。简单地说,我有一个列表框,里面有 6 个不同的“项目”(General/oSnaps/blah/blah/blah),当有人单击列表框中的一个项目时,我希望它更改面板。我有 6 个不同的面板(面板 1、面板 2 等)堆叠在一起,加载时只有第一个设置为可见。

我确定这只是设置哪个面板可见的问题,但我如何实际将其链接到列表框中的“项目”? SelectedIndexChanged 是我认为的答案,但我对编程非常陌生。

MSDN 只演示了如何在不同列表框中的项目之间进行切换。

任何帮助将不胜感激。

编辑:这是我当前的代码

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {

           string curItem = listBox1.SelectedItem.ToString(); 

           curItem = listBox1.SelectedItem.ToString(); 
            MessageBox.Show(curItem);

           switch(curItem)
        {
        case : "General"   //error here is: Only assignment, call,increment,await,and new object expressions can be used as a statement
        panel1.Visible = false;
        panel2.Visible = true;
        break;
        case : "E-Snaps" // same as above
        panel2.Visible = false;
        panel3.Visible = true;
        break;
        case : "blah" // same as above
        panel3.Visible = false;
        panel4.Visible = true;
        }
        }

单击列表框中的不同项目确实会显示一个包含正确内容的消息框(General/E-Snaps/blah/etc)。所以它显然是在读取它,我们现在如何让它切换面板?

难道我也不能这样做吗?

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {

           string curItem = listBox1.SelectedItem.ToString();

           curItem = listBox1.SelectedItem.ToString();

            if curItem = "General"
            {
                panel1.Visible = true;
            }

}

不是说我可以让任何一个工作......但这似乎合乎逻辑。如果我可以进行某种形式的字符串/布尔转换......

【问题讨论】:

    标签: c# listbox panel


    【解决方案1】:

    您可以先在 selectedindex 上使用 switch 语句更改

    所以它看起来像这样

    private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        // Get the currently selected item in the ListBox. 
        string curItem = listBox1.SelectedItem.ToString();
    
        switch(curItem)
        {
            case "blah": 
                panel1.visible = false;
                panel2.visible = true;
                break;
            case "blah": 
                panel2.visible = false;
                panel3.visible = true;
                break;
            case "blah": 
                panel3.visible = false;
                panel4.visible = true;
                break;
        }
    }
    

    等等,希望对你有帮助

    解释:“blah”是你想要评估的值,所以如果我在做水果

    “废话”会=苹果 或香蕉或菠萝等

    【讨论】:

    • 所以...你是说我想要 blah to = 当前选择的任何列表框项目?
    • 是的,基本上就是这样
    • 是的...我将如何做到这一点?我想我很困惑,因为我似乎不能只调用列表框中的每个不同项目。我希望能够获取 listboxitem1 或 listboxitem2 等。将“blah”更改为我实际拥有的 (General/oSnaps/etc) 没有任何作用。
    • ok 之后 curItem = listbox1.selecteditem.tostring 放入 messagebox.show(curItem) 并让我知道结果是什么 这是因为每个案例都必须是唯一的所以案例:“一般" 案例:"oSnap" 案例:"NextOne" 案例:"TheOneAfter"
    • 好的,还要确保你比较的是文本而不是值,否则你将不得不使用'SelectedValue.ToString()'
    【解决方案2】:

    我会在绑定中使用 IValueConverter —— 它可以让您将每个面板的可见性直接绑定到 ListBox.SelectedIndex

    <Grid>
        <Grid.Resources>
            <local:IndexToVisibilityConverter x:Key="IndexToVisibilityConverter" />
        </Grid.Resources>
        <ListBox x:Name="listBox"> ... </ListBox>
    
        <Border x:Name="panel1" 
                Visibility="{Binding ElementName=listBox,
                                     Path=SelectedIndex,
                                     Converter={StaticResource IndexToVisibilityConverter}
                                     ConverterParameter='0'}"
        />
        <Border x:Name="panel2" 
                Visibility="{Binding ElementName=listBox,
                                     Path=SelectedIndex,
                                     Converter={StaticResource IndexToVisibilityConverter}
                                     ConverterParameter='1'}"
        />
    </Grid>
    

    如果索引与参数匹配,“IndexToVisibilityConverter”应该返回“Visibility.Visible”:

    public class IndexToVisibilityConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int)value == int.Parse((string)parameter) ? Visibility.Visible : Visibility.Collapsed);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    另外,请注意,如果您想使用过渡(如交叉淡入淡出、滑入/滑出等),那么您可能希望在 SelectionChanged 事件上使用事件触发器,以及情节提要或 VisualState 更改。

    【讨论】:

    • 感谢您的代码,但这对我来说绝对太先进了。如果我有声望,我会投票给你:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多