新手求助几个简单问题

Profiteer 2012-09-06 09:47:10
刚学wpf没多久,目前遇到几个技术问题,求高手指点:
1、我自定义了一个控件ImageButton,继承自Button,我想改变显示的Content,我在xaml中有一段是<TextBox Text="{TemplateBinding Content}">,同时有<Setter Property="Content" Value="ImageButton"/>,可是为什么我最终在界面放置的自定义控件,显示的content是"Button"而不是"ImageButton"呢?即使我在逻辑代码中有ContentProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata("ImageButton"));也不行。请问,我应该怎么实现呢?(同时还有更改默认的宽度和高度等)

2、我自定义了一个控件SwitchButton,继承自ToggleButton,这个控件的样式类似360软件里面的一个按钮开关
样式如下:(不能上传图片,真烦人)。一个矩形框,在checked=true时候左侧显示开,在checked=false的时候,右侧显示关,开和关当然不能同时显示啦。我在ControlTemplate中使用了Trigger,<Trigger Property="IsChecked" Value="True">时候让开显示,关不显示,相反的IsChecked=false时候让关显示,让开不显示。 可是当我在最终的界面使用这个控件的时候,我点击这个控件,然后逻辑代码中改变它的IsChecked状态,可是这个控件的开关显示却没有变化,不知是什么原因呢?

3、做一个类似菜单的界面,假如有5项,背景是一个矩形框,选中不同的项,矩形框就在各个项之间来回滚动,如果单从xmal方面能否实现?是否一定要固定整个菜单的宽度和背景矩形框的宽度呢?

求指教,不胜感激!!!
...全文
190 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Profiteer 2012-09-10
  • 打赏
  • 举报
回复
关于第一个问题:从Button继承过来的ImageButton好像使用ContentProperty.OverrideMetadata不起作用,但是BackgroundProperty.OverrideMetadata却管用,目前的结果是,Content、Width和Height不能通过OverrideMetadata方式和在xaml中setter的方式修改。是否需要重写才能解决呢?如果ImageButton从ButtonBase继承,则从工具栏中拖到窗体后,ImageButton默认大小跟从Button继承的默认大小是不一样的。

关于问题二:我不应该从ToggleButton继承,因为它本身在点击的时候就chang了checked属性。

关于第三个问题,是否有人帮忙解答下?

同时还有一个问题,假如我有一个用户控件,在里面用sharp画了一个房子的图形,如何保证这个控件在放置到用户界面的时候,改变其大小也能保证这个sharp(房子)也按比例缩放呢?求指教。
Architecture Net 2012-09-06
  • 打赏
  • 举报
回复
1.个人觉得应该是你设置的属性未生效引起的。可以尝试通过后台设置文字的方式去尝试。
2.直接针对SwitchButton的Visiable属性绑定属性设置隐显呢?
Profiteer 2012-09-06
  • 打赏
  • 举报
回复
上面是后台逻辑代码和前台的xaml文件。

其实我只是想在用户从工具栏拖我创建的控件到界面上时,让宽度=90,高度=30,内容=ImageButton而不是Button(默认)
Profiteer 2012-09-06
  • 打赏
  • 举报
回复
源代码如下:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace JiaBoo.Controls.Buttons
{
/// <summary>
/// 包含图片的按钮类
/// </summary>
public class ImageButton : Button
{
public static readonly DependencyProperty ImageSourceProperty;
//public static readonly DependencyProperty ContentProperty;

static ImageButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton)));

ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageButton), new FrameworkPropertyMetadata(null));
ContentProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata("ImageButton"));
}
/// <summary>
/// 图片
/// </summary>
public ImageSource ImageSource
{
get { return (ImageSource)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}

public ImageButton()
{
this.Width = 90;
this.Height = 30;
this.Content = "ImageButton";
}
}
}



<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:JiaBoo.Controls.Buttons">
<Style TargetType="{x:Type local:ImageButton}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#80CDCDCD" Offset="0" />
<GradientStop Color="#FFCDCDCD" Offset="0.5" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ImageButton}">
<Grid Name="TemplateRoot" SnapsToDevicePixels="True">
<Rectangle RadiusX="2" RadiusY="2" Fill="{TemplateBinding Background}" />
<Border CornerRadius="2,2,2,2" Margin="1,1,1,1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#50FFFFFF" Offset="0.5385" />
<GradientStop Color="#00FFFFFF" Offset="0.5385" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
</Border>
<Border BorderThickness="1,0,1,1" BorderBrush="#80FFFFFF" Margin="1,1,1,1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#80FFFFFF" Offset="0.05" />
<GradientStop Color="#00FFFFFF" Offset="0.25" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
</Border>
<Grid Margin="2,2,2,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Rectangle Margin="5">
<Rectangle.Fill>
<ImageBrush AlignmentX="Center" AlignmentY="Center" ImageSource="{TemplateBinding ImageSource}"></ImageBrush>
</Rectangle.Fill>
</Rectangle>
<Image Margin="5" Source="{TemplateBinding ImageSource}"/>
<ContentPresenter Grid.Column="1" RecognizesAccessKey="True" Margin="5,0,0,0" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" HorizontalAlignment="Left" VerticalAlignment="Center" SnapsToDevicePixels="True" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
下载代码方式:https://pan.quark.cn/s/c66ecb4d06ce 同源策略:从安全角度出发,浏览器会对脚本发起的跨站请求施加限制,要求JavaScript或Cookie仅能获取同源(即协议、域名和端口完全一致)下的资源。正因如此,不同项目间的调用会受到浏览器的阻碍。以常见情境为例:WebApi作为数据服务层,它是一个独立的项目,而MVC项目则承担Web的展示功能,此时MVC项目需要调用WebApi中的接口以获取数据并在页面上呈现。由于WebApi与MVC属于两个独立的项目,运行后便会产生前面提及的跨域问题。WebApi的跨域问题主要源于浏览器的同源策略,这是一种安全措施,旨在限制JavaScript或Cookie仅能访问同一源(包括协议、域名和端口)下的内容。在实际开发过程中,当WebApi作为一个独立服务,例如数据服务层,而MVC项目作为前端展示层时,两者运行在不同的项目和端口下,浏览器将阻止MVC对WebApi的跨域请求,从而影响数据的正常获取。为了应对这一问题,我们可以采用CORS(跨域资源共享)机制。CORS通过在HTTP请求与响应头中嵌入特定标识,向浏览器明确哪些跨域请求是被允许的。例如,服务器可以在响应头中添加`Access-Control-Allow-Origin:http://localhost:8081`,表示允许来自http://localhost:8081的请求访问资源。解决WebApi跨域问题的具体实施步骤如下: 1. 构建一个包含MVC项目(Web)与Web API项目(WebApiCORS)的解决方案。 2. 在MVC项目中,例如Home控制器的Index视图,通过Ajax向WebApiCORS发起跨域请求。 3...

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧