2009-02-15 58 views
1

是否可以在运行时更新模板化的AutoCompleteBox的BorderBrush?我似乎无法设置BorderBrush或背景。Silverlight AutoCompleteBox BorderBrush运行时颜色变化?

甚至像TxtFoodSearch.BorderBrush = new SolidColorBrush(Colors.Red)这样的基本语句在页面加载后似乎没有什么区别。

我的Xaml如下。

   <controls:AutoCompleteBox x:Name="MyAutoCompleteSample" Margin="17,24,58,32" FontSize="12"> 
       <controls:AutoCompleteBox.Style> 
        <Style TargetType="controls:AutoCompleteBox"> 
         <Setter Property="IsTabStop" Value="False" /> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="controls:AutoCompleteBox"> 
            <Grid Margin="{TemplateBinding Padding}" 
        Background="{TemplateBinding Background}"> 
             <TextBox IsTabStop="True" x:Name="Text" Style="{TemplateBinding TextBoxStyle}" Margin="0" 
             KeyDown="MyAutoCompleteSample_KeyDown" 
             /> 
             <Popup x:Name="Popup"> 
              <Border x:Name="PopupBorder" HorizontalAlignment="Stretch" Opacity="0.0" BorderThickness="0" CornerRadius="3"> 
               <Border.RenderTransform> 
                <TranslateTransform X="1" Y="1" /> 
               </Border.RenderTransform> 
               <Border.Background> 
                <SolidColorBrush Color="#11000000" /> 
               </Border.Background> 
               <Border 
           HorizontalAlignment="Stretch" 
           Opacity="1.0" 
           Padding="0" 
           ToolTipService.ToolTip="Select or enter your food selection" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           CornerRadius="3"> 
                <Border.RenderTransform> 
                 <TransformGroup> 
                  <TranslateTransform X="-1" Y="-1" /> 
                 </TransformGroup> 
                </Border.RenderTransform> 
                <Border.Background> 
                 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
                  <GradientStop Color="#FFDDDDDD" Offset="0"/> 
                  <GradientStop Color="#AADDDDDD" Offset="1"/> 
                 </LinearGradientBrush> 
                </Border.Background> 
                <ListBox 
             x:Name="SelectionAdapter" 
             ScrollViewer.HorizontalScrollBarVisibility="Auto" 
             ScrollViewer.VerticalScrollBarVisibility="Auto" 
             ItemContainerStyle="{TemplateBinding ItemContainerStyle}" 
             ItemTemplate="{TemplateBinding ItemTemplate}" /> 
               </Border> 
              </Border> 
             </Popup> 
             <VisualStateManager.VisualStateGroups> 
              <VisualStateGroup x:Name="PopupStates"> 
               <VisualStateGroup.Transitions> 
                <VisualTransition GeneratedDuration="0:0:0.1" To="PopupOpened" /> 
                <VisualTransition GeneratedDuration="0:0:0.2" To="PopupClosed" /> 
               </VisualStateGroup.Transitions> 
               <VisualState x:Name="PopupOpened"> 
                <Storyboard> 
                 <DoubleAnimation Storyboard.TargetName="PopupBorder" Storyboard.TargetProperty="Opacity" To="1.0" /> 
                </Storyboard> 
               </VisualState> 
               <VisualState x:Name="PopupClosed"> 
                <Storyboard> 
                 <DoubleAnimation Storyboard.TargetName="PopupBorder" Storyboard.TargetProperty="Opacity" To="0.0" /> 
                </Storyboard> 
               </VisualState> 
              </VisualStateGroup> 
             </VisualStateManager.VisualStateGroups> 
            </Grid> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </controls:AutoCompleteBox.Style> 
      </controls:AutoCompleteBox> 

回答

0

我设法找到如何解决通过代码的样式的一种方法如下。

走可视化树,并获得AutoCompleteBox,将其转换一个文本框,然后调整颜色(边框,背景等)

//Cast into textbox 
TextBox Temp = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(MyAutoCompleteControl, 0), 0) as TextBox; 

Temp.BorderBrush = new SolidColorBrush(Colors.Red);//Change border color 

我敢肯定有一个更好的方法,但这似乎上班。

0

如果您使用的是Silverlight 3(其中样式可以多次设置),那么更容易:您可以实际设置TextBoxStyleon MSDN here)。

然后,您可以在代码隐藏(痛苦)中创建新的样式,或者可以在代码中更改/应用另一个预定义的样式。