none
WPF 如何利用程式碼修改Path 物件的內容 RRS feed

  • 問題

  • C#程式碼如下:

    <Path x:Name="EllipsePath" Fill="White" StrokeThickness="3" >
            <Path.Data>
             <GeometryGroup>
              <EllipseGeometry RadiusX="150" RadiusY="150" Center="150,150" />
              <EllipseGeometry RadiusX="1" RadiusY="1" Center="150,150" />
             </GeometryGroup>
            </Path.Data>
    </Path>

    Q1:我要需利用Slider改變RadiusX/Y值,需要如何用程式來達成執行時的變更(非編輯時的Xmal)?

    Q2:Slider 物件我設定了SmallChange\LargeChange 之外,還能設定哪種參數來達到用滑鼠拖拉Slider時,

         數值能以"整數"為最小單位(目前使用滑鼠左鍵壓下後拖拉會出現小數點的數值,如: 50.23)?

     

     

    2011年8月1日 上午 03:36

解答

  • Hi,

    請試看看以下的範例:

    	<Grid>
    		<Grid.RowDefinitions>
    			<RowDefinition Height="*" />
    			<RowDefinition Height="100" />
    		</Grid.RowDefinitions>
    		<Path x:Name="EllipsePath" Fill="Black" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center">
    			<Path.Data>
    				<GeometryGroup>
    					<EllipseGeometry RadiusX="150" RadiusY="150" Center="150,150" />
    					<EllipseGeometry RadiusX="10" RadiusY="10" Center="150,150" x:Name="ellipse" />
    				</GeometryGroup>
    			</Path.Data>
    		</Path>
    		<Grid Grid.Row="1" Margin="10">
    			<Grid.ColumnDefinitions>
    				<ColumnDefinition Width="0.864*"/>
    				<ColumnDefinition Width="0.136*"/>
    			</Grid.ColumnDefinitions>
    			<Slider Height="23" x:Name="slider1" d:LayoutOverrides="VerticalMargin" TickFrequency="1" TickPlacement="TopLeft" Maximum="20" IsSnapToTickEnabled="True" />
    			<Button x:Name="button" Content="Apply" HorizontalAlignment="Center" Width="75" d:LayoutOverrides="Height" Grid.Column="1" VerticalAlignment="Center" Click="button_Click" />
    		</Grid>
    	</Grid>
    
    

    CodeBehind:

        private void button_Click( object sender , RoutedEventArgs e )
        {
          this.ellipse.RadiusX = slider1.Value;
          this.ellipse.RadiusY = slider1.Value;
        }
    


    Slider以整數為單位的相關資訊可以參考:How do you make a WPF slider snap only to discrete integer positions?

     

    希望以上內容對您有幫助~


    Ouch Liu
    Welcome to visit by blog: Ouch@點部落
    Welcome to join the Designer x Developer group on Facebook: Facebook 設計x程式 社團
    • 已標示為解答 marcopolo104 2011年8月1日 上午 05:42
    2011年8月1日 上午 04:13

所有回覆

  • Hi,

    請試看看以下的範例:

    	<Grid>
    		<Grid.RowDefinitions>
    			<RowDefinition Height="*" />
    			<RowDefinition Height="100" />
    		</Grid.RowDefinitions>
    		<Path x:Name="EllipsePath" Fill="Black" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center">
    			<Path.Data>
    				<GeometryGroup>
    					<EllipseGeometry RadiusX="150" RadiusY="150" Center="150,150" />
    					<EllipseGeometry RadiusX="10" RadiusY="10" Center="150,150" x:Name="ellipse" />
    				</GeometryGroup>
    			</Path.Data>
    		</Path>
    		<Grid Grid.Row="1" Margin="10">
    			<Grid.ColumnDefinitions>
    				<ColumnDefinition Width="0.864*"/>
    				<ColumnDefinition Width="0.136*"/>
    			</Grid.ColumnDefinitions>
    			<Slider Height="23" x:Name="slider1" d:LayoutOverrides="VerticalMargin" TickFrequency="1" TickPlacement="TopLeft" Maximum="20" IsSnapToTickEnabled="True" />
    			<Button x:Name="button" Content="Apply" HorizontalAlignment="Center" Width="75" d:LayoutOverrides="Height" Grid.Column="1" VerticalAlignment="Center" Click="button_Click" />
    		</Grid>
    	</Grid>
    
    

    CodeBehind:

        private void button_Click( object sender , RoutedEventArgs e )
        {
          this.ellipse.RadiusX = slider1.Value;
          this.ellipse.RadiusY = slider1.Value;
        }
    


    Slider以整數為單位的相關資訊可以參考:How do you make a WPF slider snap only to discrete integer positions?

     

    希望以上內容對您有幫助~


    Ouch Liu
    Welcome to visit by blog: Ouch@點部落
    Welcome to join the Designer x Developer group on Facebook: Facebook 設計x程式 社團
    • 已標示為解答 marcopolo104 2011年8月1日 上午 05:42
    2011年8月1日 上午 04:13
  • <EllipseGeometry RadiusX="150" RadiusY="150" Center="150,150" />
    <EllipseGeometry RadiusX="10" RadiusY="10" Center="150,150" x:Name="ellipse" />

    這部分重點是x:Name="ellipse" 對嗎? ,是否需要把Slider 與 Path 至於同一Canvas 物件下,因為當我使用

    <this.物件> 會找不到"ellipse" 的物件?

    2011年8月1日 上午 05:23
  • Hi,

    替EllipseGeometry加上x:Name是為了能在CodeBehind透過它的名稱去操作它。

    上面的範例我自己操作過是可以Work的,照理說Slider和Path只要是在同一個Xaml(Class)裡應該就能存取得到,或許您可以試著重建專案,或是直接以我提供的範例測試看看。

     

    希望對您有幫助~


    Ouch Liu
    Welcome to visit by blog: Ouch@點部落
    Welcome to join the Designer x Developer group on Facebook: Facebook 設計x程式 社團
    2011年8月1日 上午 05:33
  • 經過實驗後,已經知道要設定為同一層物件下 才可以找到,謝謝你的答覆.

    2011年8月1日 上午 05:42