我是WPF 高手,每天只回答一个问题
wpf吧
全部回复
仅看楼主
level 7
c252915138 楼主
如题,把握机会,不要错过
2014年01月03日 09点01分 1
level 7
刚遇的问题,正在想办法,内存中new一个Canvas,不物理呈现的前提下,如何转化为本地的IMage图片文件,求贴出能运行的代码
2014年01月03日 12点01分 2
用RenderTargetBitmap就可以不显示保存图片。
2024年03月06日 03点03分
用RenderTargetBitmap就可以不显示保存图片。
2024年03月06日 03点03分
level 7
c252915138 楼主
这个问题我遇到过,以前在C/C++里面候经常用GDI保存内存流图片,WPF不能这样,
但有DrawingContext 类似GDI的功能,也不复杂
贴个函数:
private void SavePhoto(string fileName)
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
// 画矩形
Rect rect = new Rect(new Point(160, 100), new Size(520, 380));
drawingContext.DrawRectangle(Brushes.Red, (Pen)null, rect);
// 画文字
drawingContext.DrawText(
new FormattedText("陈冠希, world",
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Microsoft Yahei"),
36, Brushes.Green),
new Point(100, 60));
drawingContext.Close();
// 利用RenderTargetBitmap对象,以保存图片
RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32);
renderBitmap.Render(drawingVisual);
// 利用JpegBitmapEncoder,对图像进行编码,以便进行保存
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
// 保存文件
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
encoder.Save(fileStream);
// 关闭文件流
fileStream.Close();
}
这种方法并不推荐
如果先呈现出来,然后导出图片,当然是最好的,你这种相当于在内存中画图,然后保存图片,GDI是最好的方法,最好是用winform来搞
2014年01月03日 14点01分 4
canvas里的所有子控件都要用GDI挨个重绘吗? 我的canvas是 (Canvas)System.Windows.Markup.XamlReader.Parse(xamlStr)动态生成的, 里面可能N个子控件以及自定义UC等. 这个思路貌似走不通
2014年01月07日 02点01分
自己换种思路
2014年01月07日 13点01分
level 11
大神,请问,我想做一个类似flash的软件,用来给视频加一些舞台特效或者动态的图片修饰,可以编辑保存文件,都需要什么知识?
2014年01月11日 23点01分 7
如果你想做个类似Flash的软件,不必叫我大神了,如果你只是要编辑效果,那你直接用AE
2014年01月12日 06点01分
@c252915138 大神果然是大神!回答的犀利啊[吐舌]
2015年03月06日 10点03分
level 5
大神,有没有控件样式或模版的xml库?
2014年01月14日 04点01分 8
http://mui.codeplex.com/ ,多的很,Metro UI 自己去搜 ,msdn也有 ,codeplex 特别多 顺便说下 是 xaml,不是xml
2014年01月14日 07点01分
@c252915138 大神 我现在想用触摸屏实现 拿手指一划 就把窗口的某个元素画出窗口 祈祷关闭这个元素的效果 怎么实现啊
2015年08月26日 06点08分
level 3
请问一下在Storyboard中播放一个关于Viewbox的动画,当一次动画之后,Viewbox的位置不在准确是怎么回事?而且原来是TranslateTransformX,Y两个方向的动画,第二次只有一个方向的了,为什么?
2014年01月17日 06点01分 10
没代码 不知道
2014年01月17日 06点01分
经典
2018年04月07日 03点04分
level 3
Storyboard _storyboard = new Storyboard();
_vb.UpdateLayout();
_vb.Width = 100;
DoubleAnimation diappear = new DoubleAnimation(0.0, 1.0, new TimeSpan(0, 0, 0,1));
_vb.BeginAnimation(Viewbox.OpacityProperty, diappear);
_vb.Child = _autoPlayers[i]._imgface;
double Vx=_autoPlayers[i]._eventPosition.X;
//Canvas.SetLeft(_vb, Vx);
//Canvas.SetBottom(_vb, _autoPlayers[i]._eventPosition.Y);
double Vy=(_midPosition.Y + 7);
_vb.Margin = new Thickness(Vx,0,0,Vy);
_vb.Child = _autoPlayers[i]._imgface;
DoubleAnimationUsingKeyFrames xDAUKF = new DoubleAnimationUsingKeyFrames();
double x = -(_autoPlayers[i]._eventPosition.X - _midPosition.X + 50);
EasingDoubleKeyFrame xEDKF = new EasingDoubleKeyFrame(x, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));
_storyboard.Children.Add(xDAUKF);
DoubleAnimationUsingKeyFrames yDAUKF = new DoubleAnimationUsingKeyFrames();
double y = _autoPlayers[i]._eventPosition.Y - _midPosition.Y / (MainWindow.tles.TimelinePositionPercent * 2);
EasingDoubleKeyFrame yEDKF = new EasingDoubleKeyFrame(y, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));
yDAUKF.KeyFrames.Add(yEDKF);
_storyboard.Children.Add(yDAUKF);
xDAUKF.KeyFrames.Add(xEDKF);
Storyboard.SetTargetProperty(yDAUKF, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));
Storyboard.SetTargetName(yDAUKF, _vb.Name);
Storyboard.SetTargetProperty(xDAUKF, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"));
Storyboard.SetTargetName(xDAUKF, _vb.Name);
_storyboard.Completed += new EventHandler(_storyboard_Completed);
_storyboard.Begin(_vb);
_storyboard.Remove(_vb);
2014年01月17日 06点01分 11
level 3
_vb是Viewbox
2014年01月17日 06点01分 12
。。你发这我也不能调试
2014年01月17日 06点01分
回复 c252915138 :找到原因了, _storyboard.AutoReverse = true;加上这一句位置就会对,问题是我不需要加。
2014年01月17日 08点01分
level 1
private readonly DllImporter mDll = new DllImporter();
private string mFilePath = String.Empty;
private LayerNumber LayerNum = LayerNumber.LN_ONE;
private ParticleSystem[] mParticleSystem = new ParticleSytstemFire[(int)LayerNumber.LN_NUM];
public MainWindow()
{
InitializeComponent();
for (LayerNumber i = LayerNumber.LN_ONE; i < LayerNumber.LN_NUM; ++i)
{
mParticleSystem[Convert.ToInt32(i)] = new ParticleSytstemFire();
}
PropertyGrid1.SelectedObject = mParticleSystem[Convert.ToInt32(LayerNum)];
string a = Environment.CurrentDirectory + "\\libcocos2d.dll";
mDll.Open(a); // 这里会崩掉 里面执行 mDll(和前面的mDll不一样) = LoadLibrary(path);
mDll.Invoke<MInitializeApplication, bool>(Panel1.Handle.ToInt32());
}
2014年01月17日 07点01分 15
我在获取dll句柄的时候崩掉的。是不是wpf不支持我这种调用啊
2014年01月17日 07点01分
服了你们,没人上段代码,我能看得出来吗,自己定义那么多类型,我又不能调试, WPF获取句柄都是这样: hwnd = new WindowInteropHelper(this).Handle;
2014年01月17日 07点01分
level 1
我在WPF里面嵌套 <WindowsFormsHost HorizontalAlignment="Left" VerticalAlignment="Center" Name="windowsFormsHost2" Height="782" Margin="0,28,0,-9" Width="804" Grid.ColumnSpan="2">
<my:Panel x:Name="Panel1"></my:Panel>
</WindowsFormsHost>
这时候我要获取Panel x:Name="Panel1的句柄呢
2014年01月17日 07点01分 16
level 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace MedusaSimulator
{
class DllImporter
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr lib);
///
/// Loadlibrary 返回的函数库模块的句柄
///
private IntPtr mDll = IntPtr.Zero;
///
/// GetProcAddress 返回的函数指针
///
public IntPtr farProc = IntPtr.Zero;
public bool IsLoaded
{
get
{
return mDll != IntPtr.Zero;
}
}
public DllImporter()
{
//var myAssemblyName = new AssemblyName { Name = "DllImporter" };
//var myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
//mModuleBuilder = myAssemblyBuilder.DefineDynamicModule("DllImporter");
}
public void Open(string path)
{
if (mDll == IntPtr.Zero)
{
mDll = LoadLibrary(path);
}
if (mDll == IntPtr.Zero)
{
throw (new Exception(" 没有找到 :" + path + "."));
}
}
public void Close()
{
if (mDll != IntPtr.Zero)
{
FreeLibrary(mDll);
mDll = IntPtr.Zero;
}
}
//private readonly ModuleBuilder mModuleBuilder;
private readonly Dictionary<Type, MethodInfo> mMethods = new Dictionary<Type, MethodInfo>();
public T InvokeMethod<T>() where T : class
{
var methodType = typeof(T);
var methodPtr = GetProcAddress(mDll, methodType.Name);
var callback = Marshal.GetDelegateForFunctionPointer(methodPtr, methodType);
return callback as T;
}
public TR Invoke<T, TR>(params object[] parameters) where T : class
{
var delegateType = typeof(T);
if (mMethods.ContainsKey(delegateType))
{
var methodInfo = mMethods[delegateType];
return (TR)methodInfo.Invoke(null, parameters);
}
var myAssemblyName = new AssemblyName { Name = "DllImporter" };
var myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
var myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("DllImporter");
var delegateMethod = delegateType.GetMethod("Invoke");
var paramInfos = delegateMethod.GetParameters();
var paramTypes = paramInfos.Select(parameterInfo => parameterInfo.ParameterType).ToArray();
var methodPtr = GetProcAddress(mDll, delegateType.Name);
var myMethodBuilder = myModuleBuilder.DefineGlobalMethod(delegateType.Name, MethodAttributes.Public | MethodAttributes.Static, delegateMethod.ReturnType, paramTypes);
var il = myMethodBuilder.GetILGenerator();
for (var i = 0; i < paramInfos.Length; i++)
{
il.Emit(OpCodes.Ldarg, i); //by value
//IL.Emit(OpCodes.Ldarga, i); //by ref
}
il.Emit(OpCodes.Ldc_I4, methodPtr.ToInt32());
//switch (IntPtr.Size)
//{
// case 4:
// il.Emit(OpCodes.Ldc_I4, methodPtr.ToInt32());
// break;
// case 8:
// il.Emit(OpCodes.Ldc_I8, methodPtr.ToInt64());
// break;
// default:
// throw new PlatformNotSupportedException();
//}
il.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, delegateMethod.ReturnType, paramTypes);
il.Emit(OpCodes.Ret);
myModuleBuilder.CreateGlobalFunctions();
var myMethodInfo = myModuleBuilder.GetMethod(delegateType.Name);
mMethods[delegateType] = myMethodInfo;
return (TR)myMethodInfo.Invoke(null, parameters);
}
}
}
// 这是我的 DllImporter.cs文件
2014年01月17日 07点01分 17
level 1
// 这是我再MainWindow.xaml.cs 中去获得libcocos2d.dll的
private readonly DllImporter mDll = new DllImporter();
private string mFilePath = String.Empty;
private LayerNumber LayerNum = LayerNumber.LN_ONE;
private ParticleSystem[] mParticleSystem = new ParticleSytstemFire[(int)LayerNumber.LN_NUM];
public MainWindow()
{
InitializeComponent();
for (LayerNumber i = LayerNumber.LN_ONE; i < LayerNumber.LN_NUM; ++i)
{
mParticleSystem[Convert.ToInt32(i)] = new ParticleSytstemFire();
}
PropertyGrid1.SelectedObject = mParticleSystem[Convert.ToInt32(LayerNum)];
string a = Environment.CurrentDirectory + "\\libcocos2d.dll";
mDll.Open(a); // 这里会崩掉 里面执行 mDll(和前面的mDll不一样) = LoadLibrary(path);
mDll.Invoke<MInitializeApplication, bool>(Panel1.Handle.ToInt32());
}
//
2014年01月17日 07点01分 18
这回够详细了吧
2014年01月17日 07点01分
libcocos2d DLL是什么东西 ,
2014年01月17日 08点01分
回复 c252915138 :这个是一个引擎,可以不管,我只是想调用一个dll
2014年01月17日 09点01分
level 7
c252915138 楼主
WPF里面的控件是没有句柄的,WPF中的控件不是传统的Win32控件,WPF中的元素是通过DirectX来绘制在屏幕上的,因此是没有HWND的。只有一个包装整个Window的对象才有一个句柄,就是我们可以在Spy++中看见的 HwndWrapper 类型,这个类型是用来包装WPF窗体的。如果你是在一个Win32/Winform中嵌入了一个WPF组件,这个组件其实也会通过这个类来包装,具体你可以使用Spy++来查看。下面我举个例子,比如你登陆一个用DirectX开发的游戏的时候, 有一个游戏登陆框, 这里面的输入框是抓不到句柄的,其实这里的输入框就相当于是画出来的,通过DX的一些基本函数绘制出的图形而已,并不是所谓Win32里面的独立的控件了。
2014年01月17日 07点01分 19
Panel1.Handle.ToInt32() 那我这样的写法不对吗 <WindowsFormsHost HorizontalAlignment="Left" VerticalAlignment="Center" Name="windowsFormsHost2" > <my:Panel x:Name="Panel1"></my:Panel> </WindowsFormsHost>
2014年01月17日 09点01分
那怎样才可以获取这个句柄呢?
2015年04月30日 15点04分
窗体: IntPtr hwnd = new WindowInteropHelper(this).Handle;
2015年05月06日 06点05分
控件: IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(uielement)).Handle;
2015年05月06日 06点05分
level 4
请问DataGrid里的行列的分割线怎么去除? 改颜色也行!
2014年01月22日 18点01分 22
GridLinesVisibility="None" 自己不回去查MSDN吗啊
2014年01月23日 08点01分
level 4
每个数值对应一种颜色怎么写 比如我的数值范围在 —1.0000到+1.0000直接。间隔单位为0.001 怎么让每个间隔对应一种颜色。RGB? 求指导。大神在吗
2014年01月24日 03点01分 23
你要那么多颜色干嘛…… 还有,你的颜色怎么用的?直接绑定到xaml还是在代码中使用?还有你的绑定是怎么绑的? 不说的话就通用回答:通过值转换器自己慢慢转……
2014年01月24日 08点01分
我要在后台写代码。主要是我的量测数值要一一对应我的颜色。
2014年01月24日 10点01分
死办法,switch case 或者if else不就行了
2014年01月24日 11点01分
也可以在颜色转换器中使用将你的数值范围乘以一个给定数然后加到一个基本的颜色值中。比如数值(x)范围在0to1中,可以int y=0; y = y +(2 * x*100); Color c= Color.FromARGB(y,y,y);
2014年01月27日 04点01分
level 1
我是WPF初学者,请教如何在Listbox中绑定图片集合,网上的代码我还是看不懂,请高手能给我详细解答下,我比较擅长PS,可以交个朋友吗
2014年01月29日 06点01分 24
你在哪个网站看的?msdn有几乎相同的内容你去看过没有? listbox绑定图片集合那是随便在它的itemsources上绑定就是了,然后建立datatemplate将图片展示出来就行了。
2014年01月29日 07点01分
可是绑定后,怎么异步加载图片啊?不然会卡死的?
2014年02月13日 14点02分
level 7
c252915138 楼主
和一般的绑定没什么区别,只是用到了数据模板,DataTemplate就是控制数据展示方式,你可以任意组合
<ListBox x:Name="list">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding FullPath}" Width="100" Height="100" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
在CS代码中建立一个类
public class Photo
{
public string FullPath { get; set; }
}
然后有一个这样的集合 public List<Photo> photos = new List<Photo>();
在photos中增加一张图片的路径,Listbox就会出现图片了
2014年01月29日 07点01分 25
关于数据绑定我一直很好奇 但是没用过 你绑定了fullpath 意味着其他的类里面不能出现相同命名的变量了么?
2014年05月15日 16点05分
当然不是,这只是个demo,fullpath是这个类中的字段,跟其它类无关 你还需要将listbox的ItemsSource 绑定到这个集合,一句话,他们必须发生关系
2014年05月16日 05点05分
level 2
大神,初级入门应该看什么书啊?有winform基础
2014年02月13日 08点02分 29
看msdn………………最好看英文版的………………中文的翻译太蛋疼了
2014年02月14日 04点02分
level 1
1.WPF xamDatagrid 中如何实现checkbox的cell一个范围内的选择
2.选择范围的checkbox值进行拷贝
3.拷贝的checkbox值贴付给其他的checkbox
大神帮忙啊,谢谢
2014年02月13日 10点02分 30
1 2 3 4 5 6 尾页