Как обновить строку texblock глобально в Silverlight? - PullRequest
2 голосов
/ 04 марта 2011

Мне нужно обновить текстовый блок внутри childWindow на основе имени файла, которое выбирается с помощью OpenDialog Window. Так как я не запускаю OpenDialog из childWindow, у меня возникают проблемы при передаче этого значения в блок texb в ChildWindow. Мне интересно, если кто-то может помочь. В результате этой проблемы, я задаюсь вопросом, возможно ли иметь OpenDialog внутри ChildWindow? Спасибо за любые идеи!

ChildWindow xaml:

<sdk:ChildWindow 
x:Class="AddPackages_ChildWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"   
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
AutomationProperties.AutomationId="AddPackages_ChildWindow">

<Grid x:Name="AddPackages_ChildWindow_LayoutRoot" AutomationProperties.AutomationId="AddPackages_ChildWindow_LayoutRoot" Style="{StaticResource AVV_GridStyle}">
    <TextBlock x:Name="txtUpdate_Package" AutomationProperties.AutomationId="txtUpdate_Package" Text="FileName" />  </Grid>

Ниже приведен код для открытия DialogBox и передачи имени выбранного файла:

private void Package_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        AddPackage_ChildWindow ap = new AddPackage_ChildWindow();
        ap.Show();

        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.Filter = "App-V Packages (*.sprj)|*.sprj|App-V Packages (*.sprj)|*.sprj";
        openFileDialog1.FilterIndex = 1;

        openFileDialog1.Multiselect = true;

        bool? userClickedOK = openFileDialog1.ShowDialog();

        if (userClickedOK == true)
        {
            //passing the file name string
            txtUpdate_Package.Text = openFileDialog1.File.Name;
            System.IO.Stream fileStream = openFileDialog1.File.OpenRead();

            using (System.IO.StreamReader reader = new System.IO.StreamReader(fileStream))
            {
                // Read the first line from the file and write it the textbox.
                // txtUpdate_Package.Text = reader.ReadLine();
            }
            fileStream.Close();
        }
    }

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Если вас не слишком беспокоит то, что пуристы ОО считают, вы можете изменить эту строку в своем коде: -

txtUpdate_Package.Text = openFileDialog1.File.Name;

к этому: -

ap.txtUpdate_Package.Text = openFileDialog1.File.Name;

Это работает, потому что автоматически сгенерированный файл класса, созданный для вашего дочернего окна Xaml, будет иметь поле типа TextBlock с именем txtUpdate_Package с доступом к внутреннему, т.е.

internal TextBlock txUpdate_Package;

Это поле присваивается во время вызова метода InitializeComponent объекта ChildWindow, который вызывается как часть его конструктора.

Однако я бы предпочел создать открытое свойство, которое будет использоваться для обработки этого, а не писать код, основанный на том, что следует рассматривать как частную внутреннюю структуру. Добавьте это свойство в код позади вашего дочернего окна.

public string Text
{
     get { return txtUpdate_Package.Text; }
     set { txtUpdate_Package.Text = value; }
}
1 голос
/ 04 марта 2011

Вы можете представить метод SetText в вашем классе ChildWindow следующим образом:

public void SetText(string text) {
    this.txtUpdate_Package.Text = text;
}

Тогда вы бы назвали это так из вашего метода Package_Click:

ap.SetText(reader.ReadLine());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...