views:

2414

answers:

2

Is it possible to update a templated AutoCompleteBox's BorderBrush at runtime? I can't seem to set the BorderBrush or the background.

Even base statements like TxtFoodSearch.BorderBrush = new SolidColorBrush(Colors.Red) don't seem to made a difference after the page has loaded.

My Xaml is below.

                <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>
A: 

One way I've managed to find how to address the styling through code is the following.

Walk the visual tree and get the AutoCompleteBox, cast that into a textbox, then adjust the colors (border, background, etc)

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

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

I'm sure there is a better way, but this seems to work.

Ben Bahrenburg
A: 

If you're using Silverlight 3 (where styles can be set multiple times), then it is easier: you can actually set the TextBoxStyle (on MSDN here).

You can then create a new Style in code-behind (a pain), or perhaps change/apply another of your pre-defined styles in code.

Jeff Wilcox