在WPF中,如何在代码后面的控件中添加边框?

时间:2009-03-30 18:16:49

标签: wpf vb.net

在我的XAML中,我想动态生成一个包含以下内容的ListBox:

<ListBox Name="MainListBox">
  <Border Style="{DynamicResource ListBoxItemRoundedBorder}">
     <ListBoxItem >
        <TextBlock>
          Some Text Here
        </TextBlock>
     </ListBoxItem>
   </Border>

  <Border Style="{DynamicResource ListBoxItemRoundedBorder}">
     <ListBoxItem >
        <TextBlock>
          Some Text Here
        </TextBlock>
     </ListBoxItem>
   </Border>

  <Border Style="{DynamicResource ListBoxItemRoundedBorder}">
     <ListBoxItem >
        <TextBlock>
          Some Text Here
        </TextBlock>
     </ListBoxItem>
   </Border>
</ListBox>

我想通过后面的代码将项目添加到此列表框中。如何通过后面的代码添加项目和边框。我可以很容易地添加列表框项目,但似乎无法弄清楚边框:

 For Each s As String in MyArray
   Dim lbi as New ListBoxItem()
   Dim tb as New TextBlock()
   tb.Text = s
   lbi.content = tb
   MainListBox.Items.Add(lbi)
 Next

编辑:要清除任何混淆,我希望每个ListBox项目周围都有一个边框。我已经更新了XAML - 实际上我想通过后面的代码动态地或相当地渲染XAML。我已经定义了边框样式。

3 个答案:

答案 0 :(得分:2)

您是否参与了模仿ListBoxItem

使用此功能获取您正在寻找的边框效果

<Style x:Key="ListBoxItemRoundedBorder" TargetType="ListBoxItem">
  <Setter Property="SnapsToDevicePixels" Value="true"/>
  <Setter Property="OverridesDefaultStyle" Value="true"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
        <Border 
          Name="Border"
          Padding="2"
          SnapsToDevicePixels="true" Style="{DynamicResource RoundedBorder}">
          <ContentPresenter />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Border" Property="Background"
                    Value="{StaticResource SelectedBackgroundBrush}"/>
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground"
                    Value="{StaticResource DisabledForegroundBrush}"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

然后在列表框中使用

<ListView ItemContainerStyle="{StaticResource ListBoxItemRoundedBorder}" />

虽然根据你的问题,我无法确切地看到你想要的设计。您是在寻找带有边框的列表还是每个项目周围都有边框的列表?

答案 1 :(得分:2)

我不明白。如果你想要一个Border,为什么不把它贴在ListBox外面上呢?我假设你需要一个Border ListBoxItem 。在这种情况下,只需修改ItemTemplate

<ListBox>
    <ListBox.ItemTemplate>
        <Border>
            <TextBlock Text="{Binding}"/>
        </Border>
    </ListBox.ItemTemplate>
</ListBox>

答案 2 :(得分:1)

  

“我想通过后面的代码将项目添加到此列表框中。”

我刚刚构建了一个页面,可以动态地将控件加载到页面上(基于集合)。

所以要回答这个问题......你必须在代码中应用设置(就像在xaml中使用模板所做的那样)。这是C#中的一个例子:(在vb中,第一行将以Dim listBoxStyle作为Style开始...)

Style listBoxStyle = new System.Windows.Style(typeof(ListBox));
listBoxStyle.Setters.Add(new Setter(ListBox.BorderThicknessProperty, new Thickness(0,0,0,0)));
ListBox rdoList = new ListBox();
rdoList.Resources.Add(typeof(ListBox), listBoxStyle);

注意厚度()。我将我设置为无边框,因为它默认为有边框。您可以使用文本框执行此操作,只需添加厚度(1,1,1,1)。

不知道如何从代码中调用动态控件,但您可能需要view this post for an easy way to access dynamic wpf controls by name value from code