Search code examples
c#classxamlwindows-phone-8instance

Modifying XAML TextBox from another class


In my MainPage PanoramaItem2 I have a TextBlock. How can I set the text of the TextBlock from another class?

I tried creating an instance of the MainPage and then finding the TextBlock but I couldn't find it. It is not in there.

This is the way I tried:

public async Task<Problem> DownloadFileFromWeb(Uri uriToDownload, string fileName, CancellationToken cToken)
        {
            var MainText = new MainPage();
            //Set text here;
            //MainText.Panorama2.DLText.Text = "New text";
        }

This is my MainPage's xaml:

<phone:PhoneApplicationPage
x:Class="PanoramaApp2.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"  Orientation="Portrait"
shell:SystemTray.IsVisible="False">

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">

    <!-- LOCALIZATION NOTE:
        To localize the displayed strings copy their values to appropriately named
        keys in the app's neutral language resource file (AppResources.resx) then
        replace the hard-coded text value between the attributes' quotation marks
        with the binding clause whose path points to that string name.

        For example:

            Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"

        This binding points to the template's string resource named "ApplicationTitle".

        Adding supported languages in the Project Properties tab will create a
        new resx file per language that can carry the translated values of your
        UI strings. The binding in these examples will cause the value of the
        attributes to be drawn from the .resx file that matches the
        CurrentUICulture of the app at run time.
     -->

     <!--Panorama control-->
    <phone:Panorama Title="my application">
        <phone:Panorama.Background>
            <ImageBrush ImageSource="/PanoramaApp2;component/Assets/PanoramaBackground.png"/>
        </phone:Panorama.Background>

        <!--Panorama item one-->
        <phone:PanoramaItem x:Name="Panorama1" Header="first item">
            <!--Single line list with text wrapping-->
            <phone:LongListSelector Margin="0,0,-22,0" ItemsSource="{Binding Items}">
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0,-6,0,12">
                            <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/>
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
        </phone:PanoramaItem>

        <!--Panorama item two-->
        <phone:PanoramaItem x:Name="Panorama2" Header="Songs">
            <!--Double line list with image placeholder and text wrapping using a floating header that scrolls with the content-->
            <phone:LongListSelector Margin="0,-38,-22,2" ItemsSource="{Binding Items}" Tap="LongListSelector_Tap">
                <phone:LongListSelector.ListHeaderTemplate>
                    <DataTemplate>
                        <Grid Margin="12,0,0,38">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <TextBlock Name="DLText" Text="{Binding StatusText, Mode = TwoWay}"
                                       Style="{StaticResource PanoramaItemHeaderTextStyle}"
                                       Grid.Row="0"/>
                        </Grid>
                    </DataTemplate>
                </phone:LongListSelector.ListHeaderTemplate>
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="12,2,0,4" Height="105" Width="432">
                            <StackPanel Width="311" Margin="8,-7,0,0">
                                <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Margin="10,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                                <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" />
                            </StackPanel>
                            <Image Source="{Binding PlayPhoto}" Width="50" Height="50" HorizontalAlignment="Left" Tap="Image_Tap_1"/>
                            <Image Source="{Binding DownloadPhoto}" Width="40" Height="40" HorizontalAlignment="Right" Tap="Image_Tap"/>
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
        </phone:PanoramaItem>

        <!--Panorama item three-->
        <phone:PanoramaItem Header="third item" Orientation="Horizontal">
            <!--Double wide Panorama with large image placeholders-->
            <Grid>
                <StackPanel Margin="0,4,16,0" Orientation="Vertical" VerticalAlignment="Top">
                    <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                    </StackPanel>
                    <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="0,12,0,0">
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                        <Border Background="#FFFFC700" Height="173" Width="173" Margin="12,0,0,0"/>
                    </StackPanel>
                </StackPanel>
            </Grid>
        </phone:PanoramaItem>
    </phone:Panorama>

    <!--Uncomment to see an alignment grid to help ensure your controls are
        aligned on common boundaries.  The image has a top margin of -32px to
        account for the System Tray. Set this to 0 (or remove the margin altogether)
        if the System Tray is hidden.

        Before shipping remove this XAML and the image itself.-->
    <!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->

</Grid>

What am I missing here? I am on WP8.1


Solution

  • You won't be able to modify the text that way anyway, because it's inside a template. You should use a binding to set the text:

    <TextBlock Name="DLText" Text="{Binding StatusText,Mode=TwoWay}"
               Style="{StaticResource PanoramaItemHeaderTextStyle}"
               Grid.Row="0"/>
    

    Add the "StatusText" property to the same view-model that contains "Items".

    Then it's just a matter of updating the view-model property. If "MainPage" is in the current frame, then you could use something like the following:

    // WinRT
    // var frame = (Frame)Windows.UI.Xaml.Window.Current.Content;
    // var page = (MainPage)frame.Content;
    
    // Silverlight
    var page = (MainPage)Application.Current.RootVisual;
    
    var viewmodel = (MyViewModel)page.DataContext;
    viewmodel.StatusText = "new text";