Как получить доступ к кнопке программно, если кнопка внутри, используя C # - PullRequest
0 голосов
/ 16 июля 2009

У меня мало вопросов, так как я впервые использую XAML.

  1. Как использовать кнопку (BrowseButton) для просмотра папки в Harddrive? В этом случае кнопка находится внутри

  2. Могу ли я использовать способ, показанный ниже? На самом деле первая док-панель будет содержать изображение и некоторую метку, а другая док-панель будет иметь tabcontrol.

  3. Если у меня есть tabcontrol, как я могу добавить просмотр списка, который может увеличить вкладки во время выполнения ... и просмотр списка также должен быть доступен во время выполнения Как добавить знак закрытия («X») в верхней части вкладки, чтобы закрыть кнопку

наверное я задавал много вопросов, извините: (

Пожалуйста, помогите

<Grid>
        <DockPanel>
            <StackPanel>
                <Image Name="imgClientPhoto" HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto" Height="auto" Grid.Column="0" Grid.Row="0" Margin="0" 
                       Source="D:ehtmp_top_left.gif" MinWidth="450" MinHeight="100" Grid.IsSharedSizeScope="True">

                </Image>

                 <Button x:Name="BrowseButton" Margin="0,13.638,30,14.362" Content="Browse" Click="BrowseButton_Click" HorizontalAlignment="Right" Width="111" />
                            <TextBox x:Name="txtBxBrowseTB" Margin="46,10,146,10" Text="TextBox" TextWrapping="Wrap" TextChanged="BrowseTB_TextChanged"></TextBox>
                            <Label HorizontalAlignment="Left" Margin="-14,22,0,10" Name="label1" Width="69.75" FontSize="13" VerticalContentAlignment="Top" HorizontalContentAlignment="Center">Path:</Label>
                        </Grid>
                    </GroupBox>
                </Grid>

            </StackPanel>

        </DockPanel>
        <DockPanel>
            <StackPanel Margin="0,158,0,0" HorizontalAlignment="Left" Width="330" Height="557.5" VerticalAlignment="Top">
                <TextBox Height="50" Name="textBox1" Width="240" Margin="0,35,0,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" />
                <ListBox Height="470" Name="listBox1" Width="332" Background="LightGray" Margin="0,0,0,0" BorderBrush="IndianRed" BorderThickness="3" />
            </StackPanel>
            <TabControl Height="234" Name="tabControl1" Width="1035" Margin="0,0,0,0">
                <TabItem Header="tabItem1" Name="tabItem1">
                    <Grid Height="144" />
                </TabItem>
            </TabControl>
        </DockPanel>
    </Grid>

1 Ответ

1 голос
/ 16 июля 2009

1) Код просмотра должен выглядеть примерно так:

private void BrowseButton_Click(object sender, RoutedEventArgs e)
{
    System.Windows.Forms.FolderBrowserDialog browse = new System.Windows.Forms.FolderBrowserDialog();
    browse.RootFolder= Environment.SpecialFolder.MyDocuments;
    browse.SelectedPath = "C:\\InitalFolder\\SomeFolder";
    if (browse.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        txtBxBrowseTB.Text = browse.SelectedPath;
    }
}

2) Я попытался упростить xaml. Это похоже на то, что вы могли бы пойти с:?

<Grid>
    <Image Name="imgClientPhoto" Margin="0" Height="262" VerticalAlignment="Top" HorizontalAlignment="Left" ></Image>
    <StackPanel VerticalAlignment="Stretch" >
        <StackPanel VerticalAlignment="Top" Orientation="Horizontal" Height="30">
            <Button Name="BrowseButton" Content="Browse" Click="BrowseButton_Click" HorizontalAlignment="Right" Width="111" />
            <Label Name="label1" Width="69.75" FontSize="13" VerticalContentAlignment="Center" HorizontalContentAlignment="Right">Path:</Label>
            <TextBox Name="txtBxBrowseTB" Width="200" Text="TextBox" VerticalContentAlignment="Center" TextWrapping="Wrap" TextChanged="BrowseTB_TextChanged"></TextBox>
        </StackPanel>
        <StackPanel>
            <StackPanel Orientation="Vertical">
                <TextBox Height="50" Name="textBox1"  />
                <ListBox Height="470" Name="listBox1" Background="LightGray" Margin="0,0,0,0" BorderBrush="IndianRed" BorderThickness="3" MouseLeftButtonUp="listBox1_MouseLeftButtonUp">
                    <ListBoxItem>User1</ListBoxItem>
                    <ListBoxItem>User2</ListBoxItem>
                    <ListBoxItem>User3</ListBoxItem>
                    <ListBoxItem>User4</ListBoxItem>
                </ListBox>
            </StackPanel>
            <TabControl Name="tabControl1" />
        </StackPanel>
    </StackPanel>
</Grid>

Вы также можете иметь кнопку закрытия в элементе заголовка вкладки. Как и многие свойства содержимого в элементах управления xaml, содержимое может фактически быть элементами управления, а не просто текстом.

        <TabControl Name="tabControl1"  >
            <TabItem Name="tabItem1" >
                <TabItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <Label>TabHeader1</Label>
                        <Button Height="20" Width="20" FontWeight="Bold" Click="CloseTabButton_Click">X</Button>
                    </StackPanel>
                </TabItem.Header>
                <Grid Height="144">
                    <ListView />
                </Grid>
            </TabItem>
        </TabControl>

3) Вот как можно динамически добавлять вкладки в C #:

private void listBox1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    //Get selected item
    ListBoxItem item = (ListBoxItem)listBox1.SelectedItem;
    string itemText = item.Content.ToString();

    //Check if item is already added
    foreach (TabItem tItem in tabControl1.Items)
    {
        if ((string)tItem.Tag == itemText)
        {
            //Item already added, just activate the tab
            tabControl1.SelectedItem = tItem;
            return;
        }
    }

    //Build new tab item
    TabItem tabItem = new TabItem();
    tabItem.Tag = itemText;

    //First build the Header content
    Label label = new Label();
    Button button = new Button();
    label.Content = itemText;
    button.Content = "X";
    button.Height = 20;
    button.Width = 20;
    button.FontWeight = FontWeights.Bold;
    button.Click += CloseTabButton_Click; //Attach the event click method
    button.Tag = tabItem; //Reference to the tab item to close in CloseTabButton_Click
    StackPanel panel = new StackPanel();
    panel.Orientation = Orientation.Horizontal;
    panel.Children.Add(label);
    panel.Children.Add(button);
    tabItem.Header = panel;

    //Then build the actual tab content
    //If you need only the ListView in here, you don't need a grid
    ListView listView = new ListView();
    //TODO: Populate the listView with what you need
    tabItem.Content = listView;

    //Add the finished tabItem to your TabControl
    tabControl1.Items.Add(tabItem);
    tabControl1.SelectedItem = tabItem; //Activate the tab
}

private void CloseTabButton_Click(object sender, RoutedEventArgs e)
{
    //The tab item was set to button.Tag when it was added
    Button button = (Button)sender;
    TabItem tabItem = (TabItem)button.Tag;
    if (tabItem != null)
    {
        button.Click -= CloseTabButton_Click; //Detach event handler to prevent memory leak
        tabControl1.Items.Remove(tabItem);
    }
}
...