none
Canvas容器中添加了控件之后,如何在缩小窗体过程中,Canvas容器中的控件被挡住的情况下出现滚动条? RRS feed

  • 问题

  • 如题,下图在缩小窗体的过程中,当TextBox控件被挡住的情况下,怎么样使滚动条可用?

     

    xaml===============================

    <Window x:Class="canvasTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="300" Width="284">
        <Grid>
            <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" >
            <Canvas Name="canvas1"  Background="LightBlue" >
                <TextBox Canvas.Left="6" Canvas.Top="9" Height="31" Name="textBox1" Width="149" />
                    <TextBox Canvas.Left="6" Canvas.Top="58" Height="31" Name="textBox2" Width="149" />
                    <TextBox Canvas.Left="6" Canvas.Top="110" Height="31" Name="textBox3" Width="149" />
                    <TextBox Canvas.Left="6" Canvas.Top="163" Height="31" Name="textBox4" Width="149" />
                </Canvas>
            </ScrollViewer>
        </Grid>
    </Window>

    2011年9月16日 10:11

答案

  • 你的问题本身是由于Canvas大小不固定造成,所以并不是你不知道大小所以就不去管它大小了,而是我们需要给它一个大小固定下来,让ScrollBar出现。我觉得最合适的方式是让Canvas的大小设置为当前Widnow的大小,如下代码,你参考以下:

     

        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" >
          <Canvas Name="canvas1"  Background="LightBlue" 
                  Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=Content.ActualWidth, Mode=OneTime}"
                  Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=Content.ActualHeight, Mode=OneTime}">
            <TextBox Canvas.Left="6" Canvas.Top="9" Height="31" Name="textBox1" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="58" Height="31" Name="textBox2" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="110" Height="31" Name="textBox3" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="163" Height="31" Name="textBox4" Width="149" />
          </Canvas>
        </ScrollViewer>
    



    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 xxyxxb2080 2011年9月19日 6:56
    2011年9月19日 5:42
    版主

全部回复

  • 固定 Canvas的大小就可以了,否则Canvas大小就会随着ScrollViewer变。比如:

      <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
        <Canvas Name="canvas1"  Background="LightBlue" Width="280" Height="300">
          <TextBox Canvas.Left="6" Canvas.Top="9" Height="31" Name="textBox1" Width="149" />
          <TextBox Canvas.Left="6" Canvas.Top="58" Height="31" Name="textBox2" Width="149" />
          <TextBox Canvas.Left="6" Canvas.Top="110" Height="31" Name="textBox3" Width="149" />
          <TextBox Canvas.Left="6" Canvas.Top="163" Height="31" Name="textBox4" Width="149" />
        </Canvas>
      </ScrollViewer>

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年9月16日 16:34
    版主
  • 如果是在不知道Canvas的大小的情况下呢?

    因为我的控件是动态加载到Canvas上面的,所以不清楚canvas的大小;在不知道canvas的大小的情况下,怎么让其出滚动条?

    2011年9月19日 1:18
  • 你的问题本身是由于Canvas大小不固定造成,所以并不是你不知道大小所以就不去管它大小了,而是我们需要给它一个大小固定下来,让ScrollBar出现。我觉得最合适的方式是让Canvas的大小设置为当前Widnow的大小,如下代码,你参考以下:

     

        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" >
          <Canvas Name="canvas1"  Background="LightBlue" 
                  Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=Content.ActualWidth, Mode=OneTime}"
                  Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=Content.ActualHeight, Mode=OneTime}">
            <TextBox Canvas.Left="6" Canvas.Top="9" Height="31" Name="textBox1" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="58" Height="31" Name="textBox2" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="110" Height="31" Name="textBox3" Width="149" />
            <TextBox Canvas.Left="6" Canvas.Top="163" Height="31" Name="textBox4" Width="149" />
          </Canvas>
        </ScrollViewer>
    



    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 xxyxxb2080 2011年9月19日 6:56
    2011年9月19日 5:42
    版主
  • 非常感谢!~

    2011年9月19日 6:57